在过去的几天里,我正在尝试调查我最近发现的非常奇怪的情况。
事情是推出的控制器在popViewControllerAnimated:
调用后看起来仍然活着。
我创建了简单的测试项目( ARC enabled ),其中两个控制器嵌入在根导航控制器中,并且已经复制了该行为。
这是第一个viewController代码触发第二个控制器:
-(IBAction)push:(id)sender {
[self performSegueWithIdentifier:@"vseg" sender:nil];
}
从我的角度来看,没什么不寻常的。在第二个控制器中有一个方法,每秒由计时器调用:
-(void) ticker {
NSLog(@"from ViewController2 %d", tickerCount++);
_counterLabel.text = [NSString stringWithFormat:@"tick: %d", tickerCount];
[self performSelector:@selector(ticker) withObject:nil afterDelay:1];
}
仍然没什么不寻常的 - 应用程序按预期工作,UILabel更新,增加了tickerCount值,消息显示在控制台上。 接下来,我们点击Back按钮,弹出第一个控制器,控制台继续从第二个控制器接收消息。
我仍然不知道它究竟意味着什么?当整个控制器保持未发布状态或只是某些clousure变量持有的ticker方法时,这对我来说并不重要。 这是测试项目http://hxml.ru/EliEX
答案 0 :(得分:1)
取消选择器只需使用
[NSObject cancelPreviousPerformRequestsWithTarget:self];
或
[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]
目标是performSelector:afterDelay:
被称为
- (void)viewWillDisappear:(BOOL)animated
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}