2015-08-28 20 views
4

我有一個AViewController,如果我創建BViewController像這樣推視圖控制器是一個實例變量,dealloc方法不會被調用時彈出它

@interface AViewController() 
{ 
    BViewController *bVC; 
} 
@end 

一個實例變量,然後推

- (void)push { 
    bVC = [[BViewController alloc] init]; 
    [self.navigationController pushViewController:bVC animated:YES]; 
} 

當BViewController彈出時,不會調用Dealloc方法。

兩個viewcontrollers幾乎都是空的,我的意思是沒有NSTimers,塊或網絡請求。 我想在AViewController中存在一個強大的參考週期,但無法弄清楚週期。

那麼,有誰能幫我解決這個問題,謝謝!

+0

所以,問題,寧,你是如何測試dealloc,你是否NSLog檢查它是否沒有被調用,我只是想知道,因爲它似乎很奇怪,它不會被調用。 – Loxx

+0

寧,我剛剛在我的一個應用程序上嘗試了這一點,這個應用程序接近於製作,並且POP視圖控制器沒有調用dealloc,之前我從未關注過這個問題,但這有點奇怪。我也將它更改爲像您一樣的IVAR,並且我也得到了相同的行爲。 – Loxx

+0

視圖控制器沒有被釋放,因爲仍然有對它的引用。只要'bVC'具有很強的參考性,就不能解除分配。 – rmaddy

回答

3

這是基本的內存管理101

後纔有沒有對象越強引用的對象被釋放。

您的ivar bVC對視圖控制器有很強的參考價值。推它添加另一個。然後你彈出它,並回到bVC的一個強有力的參考。所以它不會被釋放。

您可以避免ivar或將其設置爲nil某些時候,因此可以取消分配視圖控制器。

+0

這是偉大的,簡單的答案,簡單的概念,完全去chagne多少我使用ivars。謝謝! – Loxx

+0

我會rmaddy,但寧問了這個問題,我向你提出了這個問題,這是我長期以來第一次瞭解到一些會改變我發展方式的東西。 – Loxx

+0

「推它添加另一個」這是否意味着導航控制器將在其堆棧中強調引用視圖控制器? – xuning0

相關問題