我有一个需要重复执行的NSTimer对象。它最终调用的代码通过4种不同的状态切换了我的应用程序中的设置。每次状态更改时,我都希望我的计时器间隔更改。该循环应在应用程序的整个生命周期中继续进行。

据我所知,您无法更新interval上的NSTimer属性。我相信这意味着我每次在计时器代码中切换状态时都需要添加代码来创建新的NSTimer对象。我在想以下实现:

//Consider that in my containing class, there is an NSTimer property, named myTimer.

//My selector method, used by myTimer
-(void) updateState:(NSTimer *) timer
{
    switch (AppState)
    {
    case state_1:
        //Update current state to state_2
        [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:30.0
                                                          target:self
                                                        selector:@selector(updateState:)
                                            userInfo:nil repeats:NO];
        break;
    case state_2:
        //Update current state to state_3
        [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:5.0
                                                          target:self
                                                        selector:@selector(updateState:)
                                            userInfo:nil repeats:NO];
        break;
    case state_3:
        //Update current state to state_4
        [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:30.0
                                                          target:self
                                                        selector:@selector(updateState:)
                                            userInfo:nil repeats:NO];
        break;
    case state_4:
        //Update current state back to state_1
        [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:5.0
                                                          target:self
                                                        selector:@selector(updateState:)
                                            userInfo:nil repeats:NO];
        break;
    }
}


这是最理想的解决方案,还是所有这些计时器的创建都会在我的应用程序连续执行时对其造成任何形式的麻烦?

另外,我在项目中启用了ARC。在这种情况下,我是否仍需要销毁先前的NSTimer对象?

最佳答案

所有这些计时器的创建会在我的应用程序连续执行时给应用程序造成任何形式的麻烦吗?


只要您正确管理内存,就可以。使用合成的二传手将为您解决这一问题。


  在这种情况下,我是否仍需要销毁先前的NSTimer对象?


没有明确。当非重复计时器触发时,它会使自身无效,并且运行循环将发送release(因为它已保留了它)。如果您对此有要求,也需要释放它,您可以使用二传手。

由于这些计时器都不重复,因此您可以删除ivar,而使用performSelector:withObject:afterDelay:

- (void)updateState {

    NSTimeInterval delay = 30;
    switch(AppState)
    {
        case 1: { break; }
        case 2: { delay = 5.0;
                  break; }
        case 3: { break; }
        case 4: { delay = 5.0;
                  break; }
    }

    [self performSelector:@selector(updateState)
               withObject:nil
               afterDelay:delay];

}


(顺便说一句,我假设您的真实代码中有break。如果没有,您肯定会的。)

10-08 09:24