注册 登录
主题 : 局部变量的nstimer是否会造成循环引用
级别: 圣骑士
状态: 连续签到 - [1天]
UID: 343247
精华: 0
发帖: 483
可可豆: 423 CB
威望: 602 点
在线时间: 840(时)
注册时间: 2014-07-14
最后登录: 2018-07-13
0 楼:  发表于: 2018-07-11 15:33    发自: Web Page
来源于 一般提问 分类

局部变量的nstimer是否会造成循环引用   

nstimer如果是一个属性,self和nstimer互相引用,确实会引发循环引用使控制器无法dealloc
但是如果nstimer是一个局部变量,会怎么样呢
我一直以为跟block一样如果是局部的就没有循环引用正常dealloc
但是刚才测了下发现依然是循环引用控制器的dealloc无法调用
求大佬解答下
级别: 圣骑士
状态: 连续签到 - [1天]
UID: 343247
精华: 0
发帖: 483
可可豆: 423 CB
威望: 602 点
在线时间: 840(时)
注册时间: 2014-07-14
最后登录: 2018-07-13
1 楼:  发表于: 2018-07-11 15:37    发自: Web Page
只是在viewDidLoad加了一个局部的定时器而已
NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ceshi) userInfo:nil repeats:YES];
ceshi那个方法内容是空的,啥都没有


分享一个常用的断开循环引用的nstimer


[ 此帖被diaoweijieios在2018-07-12 10:19重新编辑 ]

描述:可防止循环应用的timer
附件: timer.zip (3 K) 下载次数:5
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2231
可可豆: 3638 CB
威望: 3559 点
在线时间: 1782(时)
注册时间: 2012-02-15
最后登录: 2018-07-16
2 楼:  发表于: 2018-07-11 16:13    发自: Web Page
定时器是加在runloop上才会起作用,并且到点之后会执行ceshi的方法,而且可以肯定的是一定是一个对象方法

你的这个代码,定时器泡在主线程的runloop上,然后又一个回调方法,这个方法属于当前你这个vc的一个对象方法
既然是对象方法那么肯定所属的对象一定要有,因此你这个对象就被主线的runloop 给占有了,
这样看来,不管你这个定时器是全局还是局部的,加在runloop的效果是一样的,主线程的runloop 不会销毁,因此一直持有你这个回调,也就一直持有这个对象

<null>
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2231
可可豆: 3638 CB
威望: 3559 点
在线时间: 1782(时)
注册时间: 2012-02-15
最后登录: 2018-07-16
3 楼:  发表于: 2018-07-11 16:22    发自: Web Page
但是可以改进一下 ,因为主线程的runloop 不可停止,原因你懂的,但是不代表我们不能把nstimer 放在子线程的runloop上并且在一定时机移除他,这样在对象释放之前,我只需要将子线程的runloop 停止 那么自动的这个对象就不再持有这个对象并且能顺利释放了

下面是个这个改进的demo
[ 此帖被wszcug在2018-07-11 17:27重新编辑 ]

附件: 1111.zip (67 K) 下载次数:23
附件: 2222.zip (67 K) 下载次数:27
<null>
级别: 圣骑士
状态: 连续签到 - [1天]
UID: 343247
精华: 0
发帖: 483
可可豆: 423 CB
威望: 602 点
在线时间: 840(时)
注册时间: 2014-07-14
最后登录: 2018-07-13
4 楼:  发表于: 2018-07-11 16:24    发自: Web Page
回 3楼(wszcug) 的帖子
又学习啦~
级别: 圣骑士
状态: 连续签到 - [1天]
UID: 343247
精华: 0
发帖: 483
可可豆: 423 CB
威望: 602 点
在线时间: 840(时)
注册时间: 2014-07-14
最后登录: 2018-07-13
5 楼:  发表于: 2018-07-11 16:31    发自: Web Page
回 3楼(wszcug) 的帖子
我一般是用创建一个nstime的对象,在里面把target给弱引用的方式破掉循环引用
级别: 精灵王

状态: 连续签到 - [287天]
UID: 566298
精华: 0
发帖: 721
可可豆: 2579 CB
威望: 1994 点
在线时间: 1343(时)
注册时间: 2016-06-01
最后登录: 2018-07-16
6 楼:  发表于: 2018-07-11 16:40    发自: Web Page
回 3楼(wszcug) 的帖子
大佬,这个kkview中没有使用计时器啊,
而且
- (void)removeFromSuperview
{
    [super removeFromSuperview];
  
//    [td cancel];
//    [runLoop removePort:port forMode:NSRunLoopCommonModes];
//    CFRunLoopStop([runLoop getCFRunLoop]);
}

注释掉这部分后,kkview还是能释放
级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2231
可可豆: 3638 CB
威望: 3559 点
在线时间: 1782(时)
注册时间: 2012-02-15
最后登录: 2018-07-16
7 楼:  发表于: 2018-07-11 16:43    发自: Web Page
回 6楼(雨秋爱吃鱼) 的帖子
靠 被你发现了。。。

<null>
级别: 精灵王

状态: 连续签到 - [287天]
UID: 566298
精华: 0
发帖: 721
可可豆: 2579 CB
威望: 1994 点
在线时间: 1343(时)
注册时间: 2016-06-01
最后登录: 2018-07-16
8 楼:  发表于: 2018-07-11 16:48    发自: Web Page
回 7楼(wszcug) 的帖子
自己没研究过nstimer具体循环引用的原因,
看2楼的说法很有说服力,就想下载demo验证下
级别: 骑士
状态: 连续签到 - [519天]
UID: 565125
精华: 0
发帖: 221
可可豆: 3063 CB
威望: 2067 点
在线时间: 583(时)
注册时间: 2016-05-25
最后登录: 2018-07-16
9 楼:  发表于: 2018-07-11 17:16    发自: Web Page
回 3楼(wszcug) 的帖子
版主, 上面那个翘着屁股的头像...可以禁止吗?
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部