繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM