iOS 中 NSProxy 的特性与应用
15 December 2020
iOS 中 NSProxy 的特性与应用
NSProxy 的特性
NSProxy
的主要功能,负责把消息转发给真正的target
的代理类;NSProxy
没有继承NSObject
,但是实现了NSObject
协议,作为一个抽象类,它没有实现初始化方法,并且会在收到任何它不响应的消息时会引发异常;NSProxy
的子类必须要实现一个初始化或创建方法,并要重写- (void)forwardInvocation:(NSInvocation *)invocation;
和-(nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
方法,来转发它没实现的方法;NSProxy
自省方法的默认实现是将消息forward
到realObject
,也就是说NSProxy
会将自省相关的selector
直接forward
到-forwardInvocation:
回调中,这些自省方法包括:
```- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector; ```
NSProxy 的应用
-
模拟类似多继承功能,实现多个对象消息的分发 实现方法是定义一个NSProxy的子类,添加多个NSObject代理对象的属性变量,并在
forwardInvocation
,methodSignatureForSelector
与respondsToSelector
方法中分依次去实现多个代理对象的方法即可。 -
解决NSTimer 实现方法同样是定义一个
NSProxy
的子类,并在forwardInvocation
与methodSignatureForSelector
方法中调用代理对象对应的方法,在使用NSTimer
的时候,把proxy
对象作为target
传入即可。
参考:
NSProxy的理解和使用:https://juejin.cn/post/6844903606483681288
NSProxy:https://zhangbuhuai.com/post/nsproxy.html