发生场景

在 Controller B 中有一个 NSTimer
@property (strong, nonatomic) NSTimer *timer;
你创建了它,并挂载到 main runloop
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:true];
然后退出 Controller B 的时候,忘记关掉 timer 了
Controller B 将不会释放,B 与 timer 循环引用。因为创建 timer 的时候把 self 直接写进去了。
方法一
既然不能直接传 self,那传 weakSelf 试试
__weak typeof(self) weakSelf = self; self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:weakSelf selector:@selector(timerAction:) userInfo:nil repeats:true];
测试结果还是发生了循环引用,B 没有释放,timer 对 weakSelf 这个变量是强引用的,timer -> weakSelf -> B -> timer,三者之间形成循环引用。
方法二
设置一个包装类,包着 Controller B 放进 timer 中,像这样
我认为 Controller B 有几 MB 那么大,泄露了很浪费内存。
WeakWrap 只有几百个字节那么小,泄露了也没关系。
WeakWrap 中对 Controller B 弱引用,WeakWrap 包着 Controller B,传进 timer 中,就算忘记关 timer,也只是泄露了 WeakWrap 和 timer。
理论上还是有内存泄露,只不过比较少,如果一个 Controller 是频繁进出的,进出一次,丢失一个,如果有几十个泄露的 timer 挂在 main runloop 上会影响性能和流畅性,你想几十个 timer 一起 fire,又调用了 timer 事件响应方法,开销还是挺大的。
方法三
NSTimer 已知是会强引用参数 target:self 的了,如果忘记关 timer 的话,传什么进去都会被强引用。干脆实现一个 timer 算了,timer 的功能就是定时调某个方法,NSTimer 的调用时间是不精确的!它挂在 runloop 上受线程切换,上一个事件执行时间的影响。
利用 dispatch_asyn() 定时执行函数。看下面代码。
- (void)loop {
[self doSomething];
......
// 休息 time 秒,再调 loop,实现定时调用
[NSThread sleepForTimeInterval:time];
dispatch_async(self.runQueue, ^{
[weakSelf loop];
});
}
dispatch_async 中调 loop 不会产生递归调用
dispatch_async 是在队列中添加一个任务,由 GCD 去回调 [weakSelf loop]
这办法解决了timer 不能释放,挂在 runloop 不能移除的问题。
利用这方法,我写了个不会发生循环引用的 timer,controller 释放,timer 也自动停止释放,甚至 timer 的 block 里面可以直接写 self,也不会循环引用。github下载地址
方法四
NSTimer 我之前没遇到过循环引用的问题,因为我一直都是配对使用,在 viewWillAppear 开启,在 viewWillDisappear 关闭,不关闭的话那么多 timer 挂载在 runloop 上感觉挺影响性能和流畅性的,就像管理内存一样,申请和释放配对使用,就不会泄露了,谁申请谁释放的原则。但是很大的团队的话,别人可能会写错,造成泄露,可以从技术上,团队编程规范上解决他。
比如定一些规范,Controller 退出一定要成功销毁,不能泄露内存。Block 里不能写 self 等等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ios
# nstimer
# 循环引用
# nstimer的循环引用
# IOS开发代码分享之用nstimer实现倒计时功能
# iOS中的NSTimer定时器的初步使用解析
# IOS 中NSTimer定时器的使用
# iOS NSTimer循环引用的办法
# iOS如何巧妙解决NSTimer的循环引用详解
# 挂在
# 递归
# 几十个
# 流畅性
# 包着
# 都是
# 是在
# 就像
# 去了
# 是有
# 也没
# 下载地址
# 那么多
# 中有
# 执行时间
# 你想
# 我一直
# 我认为
# 可以直接
# 写了
相关文章:
桂林网站制作公司有哪些,桂林马拉松怎么报名?
建站主机默认首页配置指南:核心功能与访问路径优化
建站主机功能解析:服务器选择与快速搭建指南
音响网站制作视频教程,隆霸音响官方网站?
如何在自有机房高效搭建专业网站?
实现虚拟支付需哪些建站技术支撑?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何在IIS中配置站点IP、端口及主机头?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何设计高效校园网站?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何在香港免费服务器上快速搭建网站?
如何选购建站域名与空间?自助平台全解析
C#怎么使用委托和事件 C# delegate与event编程方法
建站之星导航配置指南:自助建站与SEO优化全解析
TestNG的testng.xml配置文件怎么写
再谈Python中的字符串与字符编码(推荐)
东莞专业制作网站的公司,东莞大学生网的网址是什么?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何在建站主机中优化服务器配置?
香港服务器部署网站为何提示未备案?
建站之星如何快速生成多端适配网站?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何用西部建站助手快速创建专业网站?
C#如何使用XPathNavigator高效查询XML
建站为何优先选择香港服务器?
如何快速打造个性化非模板自助建站?
高性价比服务器租赁——企业级配置与24小时运维服务
建站DNS解析失败?如何正确配置域名服务器?
如何通过NAT技术实现内网高效建站?
,有什么在线背英语单词效率比较高的网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何在橙子建站上传落地页?操作指南详解
如何通过网站建站时间优化SEO与用户体验?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
做企业网站制作流程,企业网站制作基本流程有哪些?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何在万网开始建站?分步指南解析
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
网站制作公司排行榜,四大门户网站排名?
如何用AWS免费套餐快速搭建高效网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
怎么将XML数据可视化 D3.js加载XML
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
*请认真填写需求信息,我们会在24小时内与您取得联系。