iOS开发中的消息转发应用于解决NSTimer

之前的一篇文章写了利用中间代理解决NSTimer造成的循环引用问题,在末尾还提到了中间代理可以优化,那是因为当时使用的中间代理是一个NSObject的子类。今天我们使用另一个类来作为中间代理---NSProxy

NSProxy

NSProxy和NSObject都是一个基类,NSProxy主要是用来作为代理处理消息转发的。
回想NSObject类消息转发的过程,先去缓存中找方法,再去类的方法列表中找,再递归去父类的方法列表中找,相对于NSProxy类这是比较耗性能的,NSProxy的消息转发完全没有这一系列过程。
接着上篇文章(iOS开发中的内存管理之解决NSTimer造成的循环引用
)我们这次使用NSProxy的一个子类来作为中间代理。
看内部代码:

@interface LSProxy : NSProxy

+ (instancetype)proxyWithTarget:(id)target;
@property (nonatomic, weak) id target;

@end  

+ (instancetype)proxyWithTarget:(id)target{
LSProxy * proxy = [LSProxy alloc];
proxy.target = target;
return proxy;
}

// 选择器的方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{
return [self.target methodSignatureForSelector:sel];
 }
- (void)forwardInvocation:(NSInvocation *)invocation{
[invocation invokeWithTarget:self.target];
}

我们可以使用performSelector来验证一下消息转发。

self.objP = [LSObjectProxy proxyWithTarget:self];
[self.objP performSelector:@selector(timerAction)];

注意:这种消息转发方式属于完整转发

快速消息转发和完整转发的不同

1.快速消息转发只需实现一个方法,而完整消息转发需要实现两个方法。
2.快速消息转发只能转发给一个接收者,而完整消息转发可以转发给多个接收者。

你可能感兴趣的:(iOS开发中的消息转发应用于解决NSTimer)