美文网首页
NSProxy 和 NSObject 关系

NSProxy 和 NSObject 关系

作者: TaoGeNet | 来源:发表于2020-02-22 18:04 被阅读0次

一、NSProxy 简介
NSProxy 是一个抽象类,它实现了protocol NSObject 所要求的基本方法,譬如内省相关的isKindOfClass:派发消息相关的performSelector 系列相关方法等;但是不能直接使用它创建对象。
子类化NSProxy 的要求也很简单,实现-forwardInvocation: 和-methodSignatureForSelector: 这两个方法即可,显然,这两个方法与消息转发相关,实现这两个方法的典型姿势是:

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    [anInvocation invokeWithTarget:_realObject];  // _realObject是自定义的实例变量
}

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [_realObject methodSignatureForSelector:aSelector];
}

二、NSProxy 的消息转发机制
虽然NSProxy 和 class NSObject 都定义了 -forwardInvocation: 和 -methodSignatureForSelector, 但这两个方法并没有在protocol NSObject 中声明;两者对这两个方法的调用逻辑完全不同。

对于Class NSObject 而言,接收到消息后先去自身的方法列表里找匹配的 selector,如果找不到,会沿着继承体系去 superclass 的方法列表找;如果还找不到,先后会经过+resolveInstanceMethod:和-forwardingTargetForSelector:处理,处理失败后,才会到-methodSignatureForSelector:/-forwardInvocation:进行最后的挣扎。

但对于NSProxy,接收 unknown selector 后,直接回调-methodSignatureForSelector:/-forwardInvocation:,消息转发过程比class NSObject要简单得多。

三、-init
除了上述的-methodSignatureForSelector:和-forwardInvocation:,NSProxy另外两个方法也非常值得说一说。
首先是-init。事实上,NSProxy没有定义这个方法,对于直接继承NSProxy的类,创建对象时不需要使用[super init]之类的调用进行初始化。为啥 Apple 不为NSProxy提供默认的构造器呢?我想这和它的定位有关吧,它是一个抽象类,不提供默认的-init反而能进一步阻止用户直接使用NSProxy创建对象。

四、NSProxy 优势
用NSProxy设计代理类的优势
NSProxy会将自省相关方法直接 forward 到forwardInvocation:回调,如果基于class NSObject实现类似的效果,得另外写不少代码,比较麻烦。
NSProxy比class NSObject干净得多,后者各种 category(譬如NSObject(NSKeyValueCoding))定义了诸多方法,这些方法的存在使得消息转发变得更麻烦,因为得区分class NSObject对象本身和其所指向的 realObject。

参考:
NSProxy
LXDZombieSniffer
MSWeakTimer

相关文章

  • NSProxy 和 NSObject 关系

    一、NSProxy 简介NSProxy 是一个抽象类,它实现了protocol NSObject 所要求的基本方法...

  • 记录NSObject 的关系

    NSObject的关系 NSProxy 没有继承NSObject,只实现了NSObject的协议,所以NSProx...

  • 重拾iOS-NSProxy

    关键词:NSProxy,NSObject,Runtime 面试题:1)知道NSProxy吗?2)NSProxy和N...

  • NSProxy 和 NSObject

    NSObject 定义 NSObject还有众多分类,NSObject(NSKeyValueCoding)实现了k...

  • NSProxy、NSInvocation、NSMethodSig

    什么是NSProxy: NSProxy是一个抽象的基类,是根类,与NSObject类似 NSProxy和NSObj...

  • NSProxy

    NSProxy和class NSObject平级,彼此没有继承关系;唯一的相同点是它们都遵循protocol NS...

  • NSProxy

    NSProxy.h文件内容 NSProxy 是一个抽象类NSProxy遵守了 NSObject 协议,内部有它的 ...

  • iOS-isa指针

    iOS所有对象的最终的父类都是NSObject,NSProxy不是NSObject的子类。NSObject有一个数...

  • iOS NSProxy探究

    什么是NSProxy NSProxy是和NSObject同级的一个类,可以说它是一个虚拟类,它只是实现了

  • 底层24:定时器、NSProxy

    NSProxy 它不继承NSObject,没有init方法。专门用来做消息转发。如果你是继承自NSObject,那...

网友评论

      本文标题:NSProxy 和 NSObject 关系

      本文链接:https://www.haomeiwen.com/subject/qfalqhtx.html