在iOS中,我从当前的viewController弹出到前一个,但它没有进入dealloc。
这是因为还有另一个指向当前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];
}
答案 0 :(得分:6)
检查以确保项目中未启用ARC。如果它未启用ARC,则应调用dealloc,除非您的代码保留了视图控制器。如果你的pop命令减少了内存,你应该检查Instruments tool
。
我可能会在下面发布的另一个答案中提到其他一些原因: 显而易见的原因是某些东西保留了你的viewController。您必须仔细查看您的代码。您是否在您的班级中执行任何使用委托的事情,因为他们有时会保留委托。 NSURLConnection将保留您的课程,NSTimer也是如此。您可以在您的课程中分散代码并记录您的课程的保留计数,并尝试找出其中的位置。在你到目前为止显示的代码中,retain可能只是1,因为类只是由导航控制器保留。
此外,在弹出视图之前,获取对它的引用,使用NO动画弹出它,然后向它发送一些消息,报告保留计数(这将是您编写的一些新方法)。这种新方法还可以记录其他内容,例如是否有任何计时器,NSURLConnections等。
答案 1 :(得分:1)
首先,摆脱[super dealloc]
。我知道这很直观,但文档说不要这样做。
在我自己的情况下,我有一个观察者&我的dealloc方法中的计时器,但由于计时器有一个指向控制器的强指针,因此无法运行。
创建了一个专门的清理方法,删除了观察者和使计时器无效。一旦运行,控制器就被正确释放。