首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

内存管理(2)

内存管理(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
返回列表