我做了以下事情:
头文件
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做了什么?
答案 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。否则你有一个悬空指针。