3

我正在使用自動引用計數。 我有一個自定義UIViewController子類,每當我打電話-presentViewController: animated:completion:或從上海華盈刪除其觀點,我想NSLog像「我dealloced」所以​​我知道視圖控制器已成功刪除。我在視圖控制器中實現了-dealloc方法。不過,我開始了一個試驗項目中,我只是有兩個UIViewController情況下(無保留週期),-dealloc不叫既可以當我推第二UIViewController模態或當我刪除了上海華或當我從父視圖控制器將其刪除。我錯過了什麼嗎?在我的原始項目(不是測試案例)中,儀器向我展示了那些控制器留下了我無法擺脫的內存佔用情況。UIViewController -dealloc方法不叫

+0

@ThilinaHewagama'-viewDidDisappear:'確實有效,但是這個方法是否表示釋放? – 2013-05-04 09:47:07

+0

我從來沒有NSZombieEnabled上,我認爲這個問題已在iOS6中解決。 – 2013-05-04 09:57:36

+1

從你在Github上發佈的內容來看,你並不十分清楚你想要做什麼。從窗口中刪除控制器的視圖不會取消分配控制器。你應該在這裏發佈一個你正在做的事情的例子 - 顯示你認爲應該被釋放的控制器的整個代碼。它有助於在上下文中看到它。 – rdelmar 2013-05-04 16:09:04

回答

11

如果你想切換視圖控制器,並有你切換從被釋放掉了一個,然後就切換窗口的根視圖控制器。所以,如果你在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(在切換控制器時獲取動畫),仍然可以通過從viewDidAppear方法演示後切換根視圖控制器來釋放初始控制器vc2:

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

完美!正是我需要的。感謝您的耐心rdelmar,祝您有美好的一天:)。 – 2013-05-04 22:09:23

0

要獲得當視圖控制器被釋放就可以實現dealloc方法爲

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

然後當視圖控制器留下的視圖來獲取打印的打印可以實現

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

抱歉,我應該在我的問題中包含我已經調用過'-dealloc'。問題是,它根本不叫... – 2013-05-04 09:52:18

0

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

ModalViewControllers只專爲某種信息/用戶輸入之類的東西的。如果你想釋放ParentViewController,你必須處理你自己的實現。當類被保持(或在這個類的東西被保留),而不是reeleased不叫

+0

感謝您的回答,它很有用。但問題是,我沒有真正調用'-presentViewController:animated:completion:'方法。我只是試圖說明我的情況。實際上,我只是將我自定義的VC視圖添加到另一個未連接到舊VC的超級視圖。 – 2013-05-04 10:09:59

+0

你可以舉一些代碼示例(https://gist.github.com)嗎? – mariusLAN 2013-05-04 10:11:43

+0

當然,你去:https://gist.github.com/anonymous/93242d562263bbf132eb – 2013-05-04 10:14:48

0

dealloc方法。它適用於既有ARC也沒有它的項目。所以請檢查你的代碼兩次。

+0

這就是爲什麼我創建了測試項目,即避免保留週期... – 2013-05-04 13:12:45