2014-02-28 54 views
0

说我有一个视图控制器。带ARC的NSTimers寿命

在我的视图控制器,我计划从一些其他类调用每9秒方法:

redTimer=[NSTimer scheduledTimerWithTimeInterval:9 target:appDelegate.koule selector:@selector(fbWander) userInfo:nil repeats:YES]; 

我有这几个问题。

如果我没有将实例变量redTimer分配给返回的NSTimer,该怎么办?会发生什么?该方法会每9秒钟被调用一次吗?

现在,由于我已将红色定时器分配给定时器,如果redTimer被分配了不同的定时器(因此没有任何东西会指向我的原始定时器了)会发生什么情况,定时器是否会死亡并停止重复?

如果我将它分配给redTimer,然后我的视图控制器被销毁,该怎么办?每隔9秒会停止一次该方法吗?

在这些情况下,计时器及其动作会发生什么?

感谢

回答

2

弧,需要有人在任何时候都很强的参考对象或它得到释放和回收。

在scheduledTimerWithTimeInterval:target:selector:userInfo:repeatats的情况下,计时器被创建并立即添加到当前运行循环中。 runloop保留它。如果重复设置为YES,则定时器保持活动状态。如果定时器设置为重复=否,它将保持活动状态,直到完成触发(直到定时器的选择器完成执行)。一旦发生这种情况,runloop发布它,它的保留计数降为零,并且它被释放。

如果定时器重复,那么它将被runloop保留,直到你使其失效。然后它被释放。

如果将计时器保存为强实例变量,则该实例变量也会保持强引用,因此计时器的引用计数器不会降至零,直到您清除强引用为止。

+0

对于使用scheduledTimerWithTimeInterval创建的重复计时器...我倾向于将它们设置为弱实例变量(或属性)。然后,当我想停止定时器时,我只是使用像'[myTimer invalidate];'的代码。这会导致runloop释放计时器。它被取消分配,然后系统将我的弱引用归零。如果我然后尝试向计时器发送第二个无效消息,则弱iVar现在为零,因此该呼叫不会执行任何操作。这意味着我不需要同时使计时器无效并将其设置为零,并且我可以发送无效计时器以确保计时器正在运行。 –