博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防止 NSTimer retain 作为 target 的 self
阅读量:6252 次
发布时间:2019-06-22

本文共 1195 字,大约阅读时间需要 3 分钟。

先吐槽一下这个标题,空格略蛋疼,不像中文,但是不写空格看上去则更诡异,求解决方案……

 

NSTimer会retain它的target,这样如果在控制器当中定义一个NSTimer,target指定为self,则会引起循环引用。

解决方案和防止block引用self一样,第一步需要把NSTimer的操作封装到一个block里,第二步则需要传递一个self的弱引用给block。

 

首先定义一个NSTimer的分类:

1 #import 
2 3 @interface NSTimer (BlockSupport) 4 5 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats; 6 7 @end 8 9 #import "NSTimer+BlockSupport.h"10 11 @implementation NSTimer (BlockSupport)12 13 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats {14 return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(blockInvoke:) userInfo:[block copy] repeats:repeats];15 }16 17 + (void)blockInvoke:(NSTimer *)timer {18 void (^block)() = timer.userInfo;19 if (block) {20 block();21 }22 }23 24 @end

这个分类支持使用Block创建NSTimer,把操作传递到了万能对象userInfo里面,之后在控制器当中以这样的方式创建:

1     __block typeof(self) weakSelf = self;2     _timer = [NSTimer scheduledTimerWithTimeInterval:0.5 block:^{3         [weakSelf doSth];4     } repeats:YES];

如此一来,NSTimer就不会令控制器的引用计数+1了。

转载于:https://www.cnblogs.com/Steak/p/3825577.html

你可能感兴趣的文章
C# 实验感悟WPF
查看>>
解决Win7 下小问题
查看>>
day25-3获取指定字符串中,大写字母、小写字母、数字的个数
查看>>
[转载] 百度上传&下载脚本
查看>>
Yii framwork - Url Manager
查看>>
为什么Facebook要将视频从Flash全面迁移到HTML5?
查看>>
poj 1149 PIGS
查看>>
mysql学习笔记--数据库视图
查看>>
SQL server 2005如何设置一个或几个字段唯一约束?
查看>>
典型用户分析
查看>>
java web编程 servlet读取配置文件参数
查看>>
ChartControl实现时间轴实现
查看>>
生成器函数
查看>>
Google(谷歌)中国工程研究院 工程师 方坤 对学生朋友的一些建议
查看>>
oracle 优化——索引与组合索引
查看>>
android基础—尺寸单位和屏幕适配
查看>>
小试 ScriptManager
查看>>
异常处理
查看>>
C/S模型之消息传输
查看>>
一道int与二进制加减题
查看>>