2015-04-04 70 views
0

我有兩個視圖控制器ViewControllerAViewControllerB不關閉ViewController的視圖控制器調用析構函數

現在ViewControllerA啓動ViewControllerB通過行動,這樣

self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/ 
[self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller 

現在ViewControllerB我返回控制權交還給ViewControllerA這樣

[self dismissViewControllerAnimated:YES completion:Nil]; 

我的問題是會的ViewControllerB析構函數被調用?我將不得不alloc它再次顯示它?

回答

3

您可能沒有正確想到這一點。該行創建了一個強引用新ViewControllerB實例:

self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/ 

(不要把下劃線在變量名,這是令人困惑ObjC和壞的可可依賴於鍵 - 值編碼約定)

此行可能(但不是你的企業)增加了一個額外保留視圖控制器:

[self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller 

此行可能(但不是你的企業)從視圖中刪除控制器保留:

[self dismissViewControllerAnimated:YES completion:Nil]; 

因此,加在一起可以肯定什麼是可能的,這是+1,+ 1,-1。所以你仍然有一個保留在對象上,並且不會被釋放(dealloc與析構函數不同;它與C++有關並且具有不同的語義)。

如果在關閉視圖控制器之後,您將self.view_library設置爲其他值,則其保留將從對象中移除,並且(如果沒有其他東西保留它),視圖控制器將被解除分配。

問題是,您需要關注平衡您的保留和釋放,這主要是由ARC爲您處理的(當您分配給強變量時保留一個,當該強變量停止引用時保留一個它)。

對於您的具體問題,是的,應該可能重新創建視圖控制器。這是常見的解決方案,即使並非總是需要。

0

如果你使用ARC和self.view_librarystrong引用它不會被釋放,所以你不需要再次使用alloc它。

+0

所以簡而言之,它不會調用析構函數?如果它不是一個強有力的參考呢? – 2015-04-04 23:58:48

+0

它不釋放對象。如果它沒有'strong'引用,它應該是dealloc,並且您需要重新分配對象以便再次'presentViewController'。 – DrKey 2015-04-05 00:14:34

相關問題