[英]Annotation dealloc method never called in ARC, underlying viewcontroller dealloc is called
[英]iOS - viewController dealloc method not called after popping to previous viewController
在iOS中,我从当前的viewController弹出到前一个,但它不会进入dealloc。
这是因为还有另一个指向当前viewController的指针,在不同的viewController中还是在当前的viewController中?
这是我弹出前一个视图的地方:
- (IBAction)fileUploadCancelTouched:(UIButton *)sender {
[self.fileToUpload cancel];
[self.view hideToastActivity];
[self.greenprogressBar removeFromSuperview];
[self.subView removeFromSuperview];
self.fileUploadCancelButton.hidden = YES;
if (self.commandComeBackToFinalScreen == 1) {
[self.navigationController popViewControllerAnimated:YES];
}
}
这是我的dealloc功能:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
self.greenprogressBar = nil;
self.fileUploadCancelButton = nil;
self.fileToUpload = nil;
[buttonHome_ release];
[buttonTestMeAgain_ release];
[buttonMarkMyTest_ release];
[examId_ release];
[sender_ release];
self.ob = nil;
[_fileUploadCancelButton release];
[super dealloc];
}
检查以确保项目中未启用ARC。 如果它未启用ARC,则应调用dealloc,除非您的代码保留了视图控制器。 如果pop命令减少了内存,则应通过Instruments tool
检查。
我在下面发布的另一个答案中可能还有其他一些原因:显而易见的原因是某些内容会保留您的viewController。 您必须仔细查看您的代码。 您是否在您的班级中执行任何使用委托的事情,因为他们有时会保留委托。 NSURLConnection将保留您的课程,NSTimer也是如此。 您可以在您的类中分散代码并记录您的类的保留计数,并尝试找出其中的位置。 在你到目前为止显示的代码中,retain可能只是1,因为类只由导航控制器保留。
此外,在弹出视图之前,获取对它的引用,使用NO动画弹出它,然后向它发送一些报告保留计数的消息(这将是您编写的一些新方法)。 这种新方法还可以记录其他内容,例如是否有任何计时器,NSURLConnections等。
首先,摆脱[super dealloc]
。 我知道这很直观,但文档说不要这样做。
在我自己的情况下,我在dealloc方法中有一个观察者和计时器,但由于计时器有一个指向控制器的强指针,因此无法运行。
创建了一个专门的清理方法,删除了观察者并使计时器无效。 一旦运行,控制器就被正确释放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.