我有一个奇怪的问题使NSTimer无效。只要用户在特定屏幕上,我就需要不断更新它。我正在使用NSTimer来完成它。我在viewDidLoad方法中编写了下面的代码。
- (void)viewDidLoad {
self.pollServerForUpdates = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(fetchNewDataFromServer:)
userInfo:nil
repeats:YES];
}
问题是当我尝试使计时器无效时。由于我希望应用程序在用户离开屏幕时停止轮询服务器,因此我将计时器失效代码放在viewWillDisappear方法中。
-(void) viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:YES];
//NSLog(@"%d",[self.view retainCount]);
[self.pollServerForUpdates invalidate];
self.pollServerForUpdates = nil;
}
我使用导航控制器在主视图和轮询视图之间来回切换。如果我在主视图和轮询视图之间快速移动,应用程序崩溃。我让NSZombie看到发生了什么,这就是我得到的
*** -[CALayer retainCount]: message sent to deallocated instance 0x1c3be0
如果我删除计时器失效,我的应用程序工作正常。但是我想在用户离开屏幕时立即停止轮询(计时器)。
我相信这种情况正在发生,因为在视图发布之前,计时器被称为分秒,我该如何避免它?我需要改变我的设计吗?任何帮助将不胜感激。
p.s:我无法在此屏幕上使用推送通知。
答案 0 :(得分:1)
可能是错误在其他地方,其他一些类正在使用您的视图而不保留对它的引用。如果你没有使你的计时器失效而不是永远引用你的视图,可能会延长它的生命周期并掩盖代码中其他地方的内存管理错误。
尝试打破异常,看看对僵尸的调用来自哪里。