Ios 带电弧的NSTimer的寿命

Ios 带电弧的NSTimer的寿命,ios,objective-c,timer,Ios,Objective C,Timer,假设我有一个视图控制器 在我的视图控制器中,我计划每9秒从其他类调用一个方法: redTimer=[NSTimer scheduledTimerWithTimeInterval:9 target:appDelegate.koule selector:@selector(fbWander) userInfo:nil repeats:YES]; 关于这一点,我有几个问题 如果我没有将实例变量redTimer分配给返回的NSTimer,该怎么办。会发生什么?该方法会永远每隔9秒调用一次吗 现在

假设我有一个视图控制器

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

   redTimer=[NSTimer scheduledTimerWithTimeInterval:9 target:appDelegate.koule selector:@selector(fbWander) userInfo:nil repeats:YES];
关于这一点,我有几个问题

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

现在,既然我已经为计时器分配了redTimer,那么如果redTimer被分配了一个不同的计时器(因此没有任何东西会再引用我的原始计时器),那么计时器会死掉并停止重复吗

如果我将它分配给redTimer,然后我的视图控制器被破坏了怎么办。。。这会阻止每9秒调用一次方法吗

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


感谢使用ARC,有人需要始终对某个对象有一个强引用,否则它就会被释放和释放

对于scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,将创建计时器,然后立即将其添加到当前运行循环中。runloop会保留它。如果repeats设置为YES,则计时器将保持活动状态。如果计时器设置为repeats=NO,则它将保持活动状态,直到完成触发(直到计时器的选择器完成执行)。一旦发生这种情况,runloop就会释放它,它的retain count会下降到零,并被释放

如果计时器正在重复,那么它将被runloop保留,直到您使其无效为止。然后它被释放


如果将计时器保存到强实例变量,则该实例变量也会维护一个强引用,因此计时器的引用计数器不会下降到零,直到将强引用置零。

对于我使用scheduledTimerWithTimeInterval创建的重复计时器。。。我倾向于将它们设置为弱实例变量(或属性)。然后,当我想停止计时器时,我只使用像
[myTimer invalidate]这样的代码。这将导致runloop释放计时器。它被解除分配,然后系统将弱引用归零。如果我随后尝试向计时器发送第二条失效消息,那么弱iVar现在为零,因此该调用不起任何作用。这意味着我不需要同时将计时器设置为nil和invalidate,我可以发送一个invalidate w/o来确保计时器正在运行。