iOS NSProxy探究

作者: 泰克2008 | 来源:发表于2019-01-18 19:50 被阅读0次

什么是NSProxy

  • NSProxy是和NSObject同级的一个类,可以说它是一个虚拟类,它只是实现了<NSObject>的协议;
  • OC是单继承的语言,但是基于运行时的机制,却有一种方法让它来实现一下"伪多继承",就是利用NSProxy这个类;
  • OC中的NSProxy类,填补了"多继承"这个空白;
  • 通过继承NSProxy,并重写这两个方法以实现消息转发到另一个实例。
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel;

使用场景

场景:使用 NSTimer or CADisplayLink 定时器时,target是自己的情况下被强引用,即使使用weakself也无效
原理:使用Proxy类型占用target(self),使用方法实现消息转发,也就是说定时器不在占有target,而使用proxy类。(第三方框架YYKit中的YYWeakProxy类就是解决了定时器强引用问题)

示例代码:

_link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
- (void)initTimer {
    YYWeakProxy *proxy = [YYWeakProxy proxyWithTarget:self];
    _timer = [NSTimer timerWithTimeInterval:0.1 target:proxy selector:@selector(tick:) userInfo:nil repeats:YES];
}
     
- (void)tick:(NSTimer *)timer {...}

在YYWeakProxy中主要重写了下面两个方法

//重写NSProxy如下两个方法,在处理消息转发时,将消息转发给真正的Target处理
- (void)forwardInvocation:(NSInvocation *)invocation {
    [invocation invokeWithTarget:self.target];
}
//
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    return [_target methodSignatureForSelector:selector];
}

注意

  • NSProxy类是没有init方法的,也就是说如果我们要获得一个NSProxy的实例,代码只需要这样:
MyProxy *proxyInstance = [MyProxy alloc];

代码实例

我这边提供了一个 Demo,用于垃圾消息处理机制的实现。
百度网盘

相关文章

  • iOS NSProxy探究

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

  • NSProxy

    NSProxy——少见却神奇的类 - IOS - 伯乐在线

  • iOS NSProxy

    NSProxy类在分布式对象架构中是很重要的。由于作用比较特别,NSProxy在Cocoa程序中出现频率很低。 N...

  • iOS -NSProxy

    可以看到,它遵守了 NSObject 协议,并且第一个 Ivar 是一个 isa 指针,因此它完全是可以拿来当一个...

  • iOS | NSProxy

    Objective-C作为一种动态消息型语言,其机制不同于Java ,C#等编译型语言.它将数据类型的确定等工作...

  • iOS:NSProxy

    OC 中一个类只有一个父类,这就是单一继承,但是我们可以用协议和NSProxy实现多继承。 1、 protocol...

  • iOS NSProxy

    NSProxy是一个实现了NSObject协议的根类。 苹果的官方文档是这样描述的:NSProxy 是一个抽象基类...

  • iOS 解决NSTimer的循环引用问题

    iOS 13以后可以通过block解决target的强引用问题,如果程序兼顾iOS13以下,那么使用NSProxy...

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 iOS-性能优化深入探究

  • ios开发-NSProxy

    作用:与NSObject属同一个级别,负责将消息转发到真正的target的代理类,实现类似于多继承的功能。 打个比...

网友评论

    本文标题:iOS NSProxy探究

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