2012-06-02 74 views
0

我的iOS應用是導航爲基礎的結構如下:集零到viewDidUnload子視圖控制器

@interface ViewControllerA : UIViewController 
@property (strong,nonatomic) ViewControllerB *viewControllerB; 
@property (strong,nonatomic) ViewControllerC *viewControllerC; 
... 

viewControllerBviewControllerC實例化之前ViewControllerAnavigationController促使他們。

在我的理解中,ViewControllerA中保留的所有內容都應設置爲零,位於ViewControllerAviewDidUnload。 我應該對子視圖控制器執行相同的操作嗎?就像這樣:

-(void)viewDidUnload 
{ 
    self.viewControllerB=nil; 
    self.viewControllerC=nil; 
} 

,我發現一個問題,當有「收到內存警告」,從viewControllerC啓動。 之後,調用父視圖控制器的viewDidUnload(即viewControllerA),從而將nil設置爲'viewControllerB'。意外的是,viewControllerB的viewDidUnload也被調用。因此,如果我將零件設置爲viewControllerB的子視圖(在viewControllerBviewDidUnload),我得到了「發送給釋放對象的消息」。

這是否意味着我不應該將nil設置爲子視圖控制器? 這種情況下內存管理的最佳做法是什麼?

P.S.我使用ARC。

回答

1

在致電viewDidUnload之後,UIViewController應保持其狀態,即不釋放任何不容易重新創建的內容。 通常您設置爲與視圖層次結構相關的任何數據,例如對viewDidLoad中創建的某些子視圖或自定義數據的強引用。在你的例子中,你的父母控制器A預計能夠在viewDidUnload被調用後恢復,這意味着將來呼叫viewDidLoad將恢復你的控制器而不會崩潰。

此外,所有視圖控制器都會爲內存警告通知進行註冊,因此當發生內存警告時,它們可以卸載當前未顯示的任何視圖。我不知道視圖控制器被調用的順序是確定性的,例如從頂部視圖控制器開始調用,所以在父控制器viewDidUnload中設置嵌套的UIViewController爲零時應該謹慎。

但是,因爲您必須在viewDidUnload之後維護您的控制器的狀態,所以您不得將您的子控制器設置爲零。你必須做的是放棄你在控制器子視圖上的每個強有力的引用(例如對UILabel的強引用等),但不能放棄控制器本身。

相關問題