簡體   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