Ios UINavigationController不';在PopViewController激活后是否释放/销毁控制器?
在过去的几天里,我试图调查我最近发现的非常奇怪的情况。 问题是,在调用Ios UINavigationController不';在PopViewController激活后是否释放/销毁控制器?,ios,uinavigationcontroller,popviewcontrolleranimated,Ios,Uinavigationcontroller,Popviewcontrolleranimated,在过去的几天里,我试图调查我最近发现的非常奇怪的情况。 问题是,在调用popViewControllerAnimated:后,被推送的控制器看起来仍然处于活动状态。 我已经创建了一个简单的测试项目(ARC enabled),在根导航控制器中嵌入了两个控制器,并且已经复制了该行为。 下面是第一个viewController代码激发第二个控制器: -(IBAction)push:(id)sender { [self performSegueWithIdentifier:@"vseg" sen
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值增加,控制台上出现消息。
接下来我们点击后退按钮,第一个控制器弹出,控制台继续接收来自第二个控制器的消息。
我还是不知道这到底意味着什么?是否整个控制器保持未发布状态,或者只是某个clousure变量持有的ticker方法,这对我来说没有意义。
下面是要取消选择器的测试项目,只需使用
[NSObject cancelPreviousPerformRequestsWithTarget:self];
或
目标是调用了performSelector:afterDelay:
的原始对象
- (void)viewWillDisappear:(BOOL)animated
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}
请参阅和文档控制器未释放,因为其计时器处于活动状态。尝试另一个“清除”测试:在控制器的
dealloc
方法中记录消息。dealloc是否在ARC概念中受到限制?对于您的ticker方法,为什么不使用NSTimer
来实现?好的,我改为NSTimer,没有区别:输出控制台仍在接收消息。实际上,第一次我在调试CLLocationManager时发现它-位置和标题事件继续发送到可能已删除的控制器。uiviewcontroller中实际上有一个保留周期。您需要在释放viewcontroller之前将其断开。CLLocationManager如何将位置和标题事件发送到控制器?即使在控制器被放弃后,它仍会继续发送它们。苹果的手册上没有明确规定你必须停止它?
- (void)viewWillDisappear:(BOOL)animated
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}