在iOS良好实践中初始化和发布NSTimer

时间:2014-07-23 06:37:58

标签: ios memory-management nstimer

我将描述我的情景:

每当用户登录应用时,我都会加载UIViewController,因为它会管理用户登录后始终显示的UIViewUIView消失时用户注销。此UIViewController已声明@property (strong, nonatomic) NSTimer *timer;。我希望这个计时器向用户显示可能需要几分钟的倒计时。每当显示UIView时,该计时器应该开始,并且每20秒重新开始计数,以便每20秒刷新一次倒计时,直到达到0:

-(void)start
{
   if (self.timer != nil) {
      [self.timer invalidate];
       self.timer = nil;
   }

   // Some operations here
   self.countdown = untilTime;    // countdown total secs

   self.timer = [NSTimer scheduledTimerWithTimeInterval:20
                                                  target:self
                                                selector:@selector(notifyTimerTick:)
                                                userInfo:nil
                                                 repeats:YES];
}

- (void)notifyTimerTick:(NSTimer *)timer
{
   self.countdown -= 20;

   if (self.countdown <= 0) {
    [self start];
   }

   [self updateCountdown];    // Countdown label shown to user
}

也就是说,每当倒计时达到0时,新的倒计时再次开始N分钟,具体取决于我在-(void)start方法中执行的某些操作。只要用户登录应用程序,此方案就应该继续有效。

AppDelegate中,当应用变为非活动状态或进入后台(或用户注销)时,我会停止此计时器:

- (void)applicationWillResignActive:(UIApplication *)application
{
   if (isUserLogged) {
      [self.countdownViewController stopTimer];
   }
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
   if (isUserLogged) {
      [self.countdownViewController stopTimer];
   }
}

stopTimer方法是这样的:

- (void)stopTimer
{
   if (self.timer != nil) {
      [self.timer invalidate];
      self.timer = nil;
   }
}

我通过调用我已经描述过的applicationDidBecomeActive:方法再次以-(void)start方法重新启动计时器,我也在用户登录应用程序时调用该方法。

这对我来说有95%的时间,但我在测试期间发现了几次,有时候倒计时的速度比它应该的要快。我的意思是,例如:如果倒计时需要6分钟,我上次看到这个奇怪的效果时花了大约3分钟达到0值,并且向用户显示的倒计时也更快地更新。这就像有多个计时器执行倒计时,但我不明白为什么,因为它通常工作正常,我没有找到导致这种情况的原因。

我在真正的iOS 7设备中测试应用的测试版时发现了这个快速倒计时。当我想看看发生了什么,并且我将设备连接到XcodeInstruments时,应用程序启动导致计时器再次正常工作,因此我无法在“工具”中调试或查看任何内容这种情况。

我想我正确管理计时器,我错过了什么?有人经历过这样的事吗?我已经阅读了一些关于发布计时器的帖子,但是他们只是说你必须使计时器无效而且我已经这样做了:

Releasing an NSTimer iPhone?

Correct way to release NSTimer?

我需要帮助来分析这个问题。非常感谢提前

编辑:我的代码是否确保只能运行一个NSTimer对象?我应该在dealloc方法中管理与计时器相关的内容吗?

0 个答案:

没有答案