iOS中解决NSTimer循环引用的三种方式

第一种:NSTimer提供的API

/**
 第一种:NSTimer提供的API
 使用NSTimer提供的API,在block中执行定时任务
 引用逻辑:self强引用timer弱引用target
 */
-(void)firstTimer{
    __weak typeof (self) weakSelf = self;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f repeats:YES block:^(NSTimer * _Nonnull timer) {
        [weakSelf fire];
    }];
}

第二种:借助runtime给对象添加消息处理的能力

/**
 第二种:借助runtime给对象添加消息处理的能力
 
 引用逻辑:self强引用timer强引用target
 */
-(void)secondTimer{
    _target = [[NSObject alloc] init];
    class_addMethod([_target class], @selector(fire), class_getMethodImplementation([self class], @selector(fire)), "v@:");
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:_target selector:@selector(fire) userInfo:nil repeats:YES];
}

-(void)dealloc{
    [self.timer invalidate];
    self.timer = nil;
}

** 第三种: 通过消息转发的方法的方式**

/**
 第三种: 通过消息转发的方法的方式
 创建一个集成自NSProxy的类XCProxy 声明一个target
 
 引用逻辑: self强引用timer强引用proxy弱引用self
 */
-(void)thirdTimer{
    self.proxy = [XCProxy alloc];
    self.proxy.target = self;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self.proxy selector:@selector(fire) userInfo:nil repeats:YES];
}

github:demo

参考:iOS中解决NSTimer循环引用的三种方式

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天是六一儿童节的前一天,孩子兴奋又紧张,今天彩排,下午几位家张报名装饰房子。4:30我们几位家长来到学校帮...
    无语梅阅读 124评论 0 0
  • 什么是权限呢? 举个简单的例子:我有一个电商平台,注册的用户分为商家用户,manager用户、普通会员。对订单的操...
    索伦x阅读 1,010评论 0 7
  • 倒计时第七天,未见成效,继续努力~
    fineyoga喵喵阅读 154评论 0 0
  • 这一周和爱人带着女儿去上海迪士尼游玩,主要是为了给她过“六·一”,。 我们在距上海迪士尼度假区1公里左右的地方选了...
    玮玮_8a27阅读 320评论 0 1