簡體   English   中英

UIViewController -dealloc方法未調用

[英]UIViewController -dealloc method not called

我正在使用自動參考計數。 我有一個自定義UIViewController子類,每當我調用-presentViewController: animated:completion:或從-presentViewController: animated:completion:刪除它的視圖我想NSLog東西,比如“我被解除分配”,所以我知道視圖控制器已成功刪除。 我在視圖控制器中實現了-dealloc方法。 但是我開始了一個測試項目,其中我只有兩個UIViewController實例(沒有保留周期),並且當我按模式推送第二個UIViewController或者當我刪除超級視圖或從父視圖控制器中刪除它時,也沒有調用-dealloc 我錯過了什么嗎? 在我原來的項目中(不是測試用例),儀器向我展示了那些控制器留下了我無法擺脫的內存占用。

如果要切換視圖控制器,並將要切換的視圖控制器解除分配,則只需切換窗口的根視圖控制器即可。 所以,如果你在VC1中並且想要轉到VC2,那么在VC1中執行此操作:

VC2 *vc2 = [[VC2 alloc] init]; // or however else is appropriate to get an instance of this class
self.view.window.rootViewController = vc2;

如果您尚未創建任何屬性以指向vc1,則在進行此切換后將取消分配。

如果要使用模態表示或模態segue(在切換控制器時獲取動畫),仍然可以通過在vc2的viewDidAppear方法的演示之后切換根視圖控制器來取消分配初始控制器:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.window.rootViewController = self;
}

要在取消分配View Controller時獲取打印,您可以將dealloc方法實現為

- (void) dealloc {
    NSLog(@"The instance of MyViewController was deallocated");
}

然后,當View Controller離開視圖時,您可以實現打印

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"The instance of MyViewController left the main view")
}

如果使用-presentViewController:animated:completion:每次調用此方法時都會保留parentViewController。 ModalViewControllers簡單地推到另一個ViewController之上。

ModalViewControllers僅適用於某種信息/用戶輸入和類似的東西。 如果要取消分配ParentViewController,則必須處理自己的實現。

當保留類(或保留此類中的某些內容)並且未重新發布時,不會調用dealloc方法。 它適用於同時具有ARC和沒有它的項目。 所以檢查你的代碼兩次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM