在popViewControllerAnimated之后,UINavigationController不释放/销毁控制器?

时间:2013-12-16 10:04:44

标签: ios uinavigationcontroller popviewcontrolleranimated

在过去的几天里,我正在尝试调查我最近发现的非常奇怪的情况。 事情是推出的控制器在popViewControllerAnimated:调用后看起来仍然活着。 我创建了简单的测试项目( ARC enabled ),其中两个控制器嵌入在根导航控制器中,并且已经复制了该行为。 enter image description here 这是第一个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按钮,弹出第一个控制器,控制台继续从第二个控制器接收消息。 enter image description here

我仍然不知道它究竟意味着什么?当整个控制器保持未发布状态或只是某些clousure变量持有的ticker方法时,这对我来说并不重要。 这是测试项目http://hxml.ru/EliEX

1 个答案:

答案 0 :(得分:1)

取消选择器只需使用

[NSObject cancelPreviousPerformRequestsWithTarget:self];

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

目标是performSelector:afterDelay:被称为

的原始对象
- (void)viewWillDisappear:(BOOL)animated
{
   [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

参考Run LoopsNSObject文档