说我有一个视图控制器。
在我的视图控制器中,我计划每隔9秒从其他类调用一个方法:
redTimer=[NSTimer scheduledTimerWithTimeInterval:9 target:appDelegate.koule selector:@selector(fbWander) userInfo:nil repeats:YES];
我对此有几个问题。
如果我没有将实例变量redTimer分配给返回的NSTimer,该怎么办?会发生什么?该方法会永远每9秒调用一次吗?
现在,由于我已经将redTimer分配给了计时器,如果为redTimer分配了一个不同的计时器(因此再也没有任何指代我的原始计时器)会发生什么情况?计时器是否会死并且不再重复?
如果我将它分配给redTimer然后我的视图控制器被销毁...会阻止该方法每9秒被调用一次吗?
在这些情况下,计时器及其动作会发生什么变化?
由于
答案 0 :(得分:2)
使用ARC,有人需要始终对某个对象进行强引用,否则它将被释放并取消分配。
在scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:的情况下,创建计时器,然后立即添加到当前运行循环。 runloop保留了它。如果重复设置为YES,则计时器保持活动状态。如果计时器设置为重复=否,它将保持活动状态,直到它完成触发(直到计时器的选择器完成执行)。一旦发生这种情况,runloop就会释放它,它的保留计数会降为零,并且会被释放。
如果计时器正在重复,那么它将被runloop保留,直到你使它无效。然后就会被释放。
如果将计时器保存为强实例变量,则实例变量也会保留强引用,因此在您输出强引用之前,计时器的引用计数器不会降至零。