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