Board logo

标题: 内存管理(2) [打印本页]

作者: look_w    时间: 2019-3-11 20:35     标题: 内存管理(2)

二.定时器

    使用CADisplayLink、NSTimer有什么注意点?
    循环引用、NSTimer定时器不准

1.CADisplayLink、NSTimer使用注意

    问题:CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用

    解决方案:

    方案1:使用block

      __weak typeof(self) weakSelf = self;
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
            [weakSelf timerTest];
       }];

    方案2:使用代理对象(NSProxy)
    如果MJProxy继承NSObject,会去父类里面搜索是否有这个方法。如果继承NSProxy,他直接就进入消息转发了。所以我们使用NSProxy。

MJProxy:

    .h:
    @interface MJProxy : NSProxy
    + (instancetype)proxyWithTargetid)target;
    @property (weak, nonatomic) id target;
    @end
     
    .m:
    @implementation MJProxy
     
    + (instancetype)proxyWithTargetid)target
    {
        // NSProxy对象不需要调用init,因为它本来就没有init方法
        MJProxy *proxy = [MJProxy alloc];
        proxy.target = target;
        return proxy;
    }
     
    - (NSMethodSignature *)methodSignatureForSelectorSEL)sel
    {
        return [self.target methodSignatureForSelector:sel];
    }
     
    - (void)forwardInvocationNSInvocation *)invocation
    {
        [invocation invokeWithTarget:self.target];
    }
    @end
     

ViewController:

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[MJProxy proxyWithTarget:self] selectorselector(timerTest) userInfo:nil repeats:YES];


使用NSProxy




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0