1、首先简单说一下OC消息发送机制
消息发送分两步:
第一步,编译阶段
不带参数:objc_msgSend(receiver,selector)
带参数:objc_msgSend(recevier,selector,org1,org2,…)
在这一阶段确定消息接受者receiver和要去执行的方法selector,这时候不会去确定方法是否实现。
第二步,运行时阶段
运行时阶段的消息发送的详细步骤如下:
- 如果selector、target两个都是有效的,那就开始查找这个类的 IMP,先从 cache 里面找,若可以找得到就跳到对应的函数去执行。
- 如果在cache里找不到就找一下方法列表methodLists。
- 如果methodLists找不到,就到超类的方法列表里寻找,一直找,直到找到NSObject类为止。
- 如果还找不到,Runtime就提供了如下三种方法来处理:动态方法解析、消息接受者重定向、消息重定向,这三者就不具体介绍了,不懂的网上自行百度。
2、NSProxy的介绍
Apple 官方文档
NSProxy is an abstract superclass defining an API for objects that act as stand-ins for other objects or for objects that don’t exist yet. Typically, a message to a proxy is forwarded to the real object or causes the proxy to load (or transform itself into) the real object. Subclasses of NSProxy can be used to implement transparent distributed messaging (for example, NSDistantObject) or for lazy instantiation of objects that are expensive to create.
NSProxy 是一个抽象基类,它是为一些作为对象的替身或者并不存在的对象
定义的API。一般的,发送给代理的消息被转发给一个真实的对象或者代理本身引起加载(或者将本身转换成)一个真实的对象。NSProxy的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy 初始化。
NSProxy我理解的其实它就是一个消息重定向封装的一个抽象类,类似一个代理人、中间件。可以通过继承它,并重写下面这两个方法来实现消息转发到另一个实例。
- (void)forwardInvocation:(NSInvocation *)invocation;
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
3、NSProxy的使用
- 实现多继承的功能
- 解决了NSTimer&CADisplayLink创建时对self强引用问题,参考YYKit的YYWeakProxy。
网友评论