NSTimer内存泄漏?

时间:2011-10-19 18:42:09

标签: ios objective-c xcode nstimer

以下是否会导致内存泄漏或者可能会以某种方式更改为更好?删除countDownTimer = nil

-(void)viewDidLoad{    
  countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}

-(void)pauseTimer{            
   NSLog(@"Fired");
   [countDownTimer invalidate];
   //countDownTimer = nil <------ Causes crash when run
}

-(void)resumeTimer{
   countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}

3 个答案:

答案 0 :(得分:1)

我认为countDownTimer是伊娃? NSTimer在他们活着的时候会保留目标,所以听起来你对[countDownTimer invalidate]的调用正在释放self的最后一个引用并导致self在中间解除分配您的-pauseTimer方法。因此,对self的任何引用,甚至是隐式引用(例如访问ivars)都会崩溃,或者至少会出现意外行为。

谁在致电-pauseTimer?也许他们应该对你的目标有一个强有力的参考。

答案 1 :(得分:1)

NSTimer在到期或无效时自动减少其保留计数。除非您将其指定为保留的ivar,否则无需将其设置为nil。 (在您的情况下意味着您还需要使用self.countDownTimer分配计时器

答案 2 :(得分:1)

一个人可以使用block方法的scheduleTimer变体来避免保留周期。

var timer = Timer()

func startTimer() {
  timer = Timer.scheduleTimer(withTimerInterval: 1.0, repeats: true, block: { [weak self] (timer) in
     self?.performUpdate(timer: timer)
  })
}

func stopTimer() {
   timer.invalidate()
}

只需确保将self捕获为weak变量即可。