iOS - 在弹出到上一个viewController后没有调用viewController dealloc方法

时间:2014-04-30 13:07:13

标签: ios lifecycle dealloc

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

2 个答案:

答案 0 :(得分:6)

检查以确保项目中未启用ARC。如果它未启用ARC,则应调用dealloc,除非您的代码保留了视图控制器。如果你的pop命令减少了内存,你应该检查Instruments tool

我可能会在下面发布的另一个答案中提到其他一些原因: 显而易见的原因是某些东西保留了你的viewController。您必须仔细查看您的代码。您是否在您的班级中执行任何使用委托的事情,因为他们有时会保留委托。 NSURLConnection将保留您的课程,NSTimer也是如此。您可以在您的课程中分散代码并记录您的课程的保留计数,并尝试找出其中的位置。在你到目前为止显示的代码中,retain可能只是1,因为类只是由导航控制器保留。

此外,在弹出视图之前,获取对它的引用,使用NO动画弹出它,然后向它发送一些消息,报告保留计数(这将是您编写的一些新方法)。这种新方法还可以记录其他内容,例如是否有任何计时器,NSURLConnections等。

答案 1 :(得分:1)

首先,摆脱[super dealloc]。我知道这很直观,但文档说不要这样做。

在我自己的情况下,我有一个观察者&我的dealloc方法中的计时器,但由于计时器有一个指向控制器的强指针,因此无法运行。

创建了一个专门的清理方法,删除了观察者和使计时器无效。一旦运行,控制器就被正确释放。