请稍侯

iOS 中 NSProxy 的特性与应用

15 December 2020

iOS 中 NSProxy 的特性与应用

NSProxy 的特性

  • NSProxy的主要功能,负责把消息转发给真正的target的代理类;
  • NSProxy没有继承NSObject,但是实现了NSObject协议,作为一个抽象类,它没有实现初始化方法,并且会在收到任何它不响应的消息时会引发异常;
  • NSProxy的子类必须要实现一个初始化或创建方法,并要重写- (void)forwardInvocation:(NSInvocation *)invocation;-(nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel方法,来转发它没实现的方法;
  • NSProxy自省方法的默认实现是将消息 forwardrealObject,也就是说NSProxy会将自省相关的 selector 直接 forward-forwardInvocation:回调中,这些自省方法包括:
    ```
    • (BOOL)isKindOfClass:(Class)aClass;
    • (BOOL)isMemberOfClass:(Class)aClass;
    • (BOOL)conformsToProtocol:(Protocol *)aProtocol;
    • (BOOL)respondsToSelector:(SEL)aSelector; ```

NSProxy 的应用

  1. 模拟类似多继承功能,实现多个对象消息的分发 实现方法是定义一个NSProxy的子类,添加多个NSObject代理对象的属性变量,并在forwardInvocation,methodSignatureForSelectorrespondsToSelector方法中分依次去实现多个代理对象的方法即可。

  2. 解决NSTimer 实现方法同样是定义一个NSProxy的子类,并在forwardInvocationmethodSignatureForSelector方法中调用代理对象对应的方法,在使用NSTimer的时候,把proxy对象作为target传入即可。

参考:
NSProxy的理解和使用:https://juejin.cn/post/6844903606483681288
NSProxy:https://zhangbuhuai.com/post/nsproxy.html