NSProxy 的简单介绍和使用

1、首先简单说一下OC消息发送机制

消息发送分两步:

第一步,编译阶段

不带参数:objc_msgSend(receiver,selector)   
带参数:objc_msgSend(recevier,selector,org1,org2,…)

在这一阶段确定消息接受者receiver和要去执行的方法selector,这时候不会去确定方法是否实现。

第二步,运行时阶段

运行时阶段的消息发送的详细步骤如下:

  • 如果selector、target两个都是有效的,那就开始查找这个类的 IMP,先从 cache 里面找,若可以找得到就跳到对应的函数去执行。
  • 如果在cache里找不到就找一下方法列表methodLists。
  • 如果methodLists找不到,就到超类的方法列表里寻找,一直找,直到找到NSObject类为止。
  • 如果还找不到,Runtime就提供了如下三种方法来处理:动态方法解析、消息接受者重定向、消息重定向,这三者就不具体介绍了,不懂的网上自行百度。
消息转发流程图.png

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。

推荐阅读更多精彩内容

  • The Inner Game of Tennis W Timothy Gallwey Jonathan Cape ...
    网事_79a3阅读 7,543评论 2 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 10,064评论 1 29
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 1,816评论 0 7
  • 本文转载自知乎 作者:季子乌 笔记版权归笔记作者所有 其中英文语句取自:英语流利说-懂你英语 ——————————...
    Danny_Edward阅读 42,930评论 4 38
  • 上周阅读书目《麦田里的守望者》,里面只有主人公从被开除到圣诞前三天的遭遇,却仿佛是学校,社会这个鱼龙混杂世界的缩影...
    沂茗阅读 167评论 0 0
  • 春夏秋冬,一年到头: 经历重复与喜悦, 在伤痕愈合时重新做人, 在新面具下重新伪装; 不知道岁月几何: 但愿自己是...
    广厦阅读 117评论 0 0
  • 文/07 北风北 北风北,一树红叶落桥北 溪流潺潺浅 松鼠树下妖 落果积叶藏 空林乌鸦叫 深秋歇脚去…… 北风北 ...
    723edf844d12阅读 381评论 8 16
  • 雪的纯洁 梅雨的忧郁 全从昨日的枝头上纷纷 滑落 去寻觅那方你我的天空 心上的人独不在 唯将洁白的花絮 默默地 ...
    晞仝阅读 205评论 8 22