Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UINavigationController不';在PopViewController激活后是否释放/销毁控制器?_Ios_Uinavigationcontroller_Popviewcontrolleranimated - Fatal编程技术网

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];
}