使计时器无效阻止我的应用程序

时间:2011-11-04 16:40:00

标签: iphone nstimer

我做了以下事情:

头文件

 NSTimer *timer1;
 NSTimer *timer2;

实施文件

- (void)viewDidLoad
{
    if(!timer1)
        timer1 = [NSTimer scheduledTimerWithTimeInterval:30.0 target: self selector: @selector(repeatRequest) userInfo: nil repeats: YES];

    if(!timer2)
        timer2 = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // Release any retained subviews of the main view.

    [timer1 invalidate];
    [timer2 invalidate];

}

因此,当我离开当前视图时,这两行会导致我的应用崩溃:

 [timer1 invalidate];
        [timer2 invalidate];

任何人都知道为什么?或者当我离开当前视图时有人知道任何其他方法来停止计时器吗?谢谢

编辑: timer2调用此方法:

- (void) repeatRequest{
    NSLog(@"backgroundRequest");
    [NSThread detachNewThreadSelector:@selector(backgroundRequest) toTarget:self withObject:nil];
}

在服务器端执行ASIHTTPRequest

现在我只保留:

[timer1 invalidate];

并且它不再阻止......但是我对timer2做了什么?

2 个答案:

答案 0 :(得分:3)

这两行实际上应该不错 - 如果你取消分配视图控制器,那么视图就会消失。

如果您可以切换回视图,则不会调用viewDidLoad。在这种情况下,正如logancautrell所说,timer1和timer2是悬空的。

所以你想要尝试的是:

 - (void)viewWillDisappear:(BOOL)animated
 {
     [super viewWillDisappear:animated];

     [timer1 invalidate];
     timer1 = nil;

     [timer2 invalidate];
     timer2 = nil;
 }

以及移动

  if(!timer1)
         timer1 = [NSTimer scheduledTimerWithTimeInterval:30.0 target: self selector: @selector(repeatRequest) userInfo: nil repeats: YES];

   if(!timer2)
         timer2 = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];

到你的

   -(void)viewDidAppear:(BOOL)animated

然后它不应该麻烦你。

答案 1 :(得分:1)

每当无效时,您必须将计时器ivars设置为nil。否则你有一个悬空指针。