NSTimer不会停止

Ily*_*ski 22 iphone cocoa-touch timer

我有一个计时器,viewWillAppear在调用方法时触发,并在调用viewDidDisappear方法时无效.但是在视图之间进行一定量的切换之后,计时器即使在无效之后也会继续触发.有什么问题?

这是我的代码:

NSTimer *timer;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f
                     target: self
                     selector:@selector( timerAction )
                     userInfo:nil
                     repeats:YES];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [timer invalidate];
    timer = nil;
}

-(void) timerAction
{
    NSLog(@"timerAction");
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*ski 38

我应该通过保留它来保持与计时器的链接.:) 5个月前我问过这个问题,这太棒了,我获得了多少经验.:)

timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];
Run Code Online (Sandbox Code Playgroud)


Mon*_*ona 14

这是绝对的解决方案.以上都没有为我工作,所以我这样做了,

你想在哪里启动计时器,

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];
Run Code Online (Sandbox Code Playgroud)

计时器调用的方法,

-(void)timerMethod
{
    // do what you need to do

    if (needs to be called again) {

        [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];        
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

  • 确实......对我来说,这看起来像是一个苹果虫.由于重复BOOL值设置为YES,invalidate方法无效,对我来说有点奇怪 (2认同)
  • 这个bug在iOS8中仍然存在.这是解决问题的唯一方法. (2认同)

los*_*sit 6

定时器调用的方法应具有定义

- (void)methodName:(NSTimer *)aTimer;
Run Code Online (Sandbox Code Playgroud)

这样,该方法具有触发的计时器实例.你这样做的方法,该方法将不知道计时器是否无效.

尝试将计时器初始化更改为

timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]
Run Code Online (Sandbox Code Playgroud)

和方法

-(void) timerAction:(NSTimer *)aTimer{...}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助