2012-01-12 65 views
4

我有一個UIViewController需要使用UINavigationControllerDelegate,特別是willShowViewController方法。正確分配/取消分配UINavigationControllerDelagate

我在設置<UINavigationControllerDelegate>,然後我將代理設置爲viewDidLoadself.navigationController.delegate = self;)。然後我實現了willShowViewController方法,並且它工作正常,但是當視圖控制器從堆棧彈出時,存在內存泄漏並且我的應用程序崩潰。我試過在viewDidUnloaddealloc中都做self.navigationController.delegate = nil;,但它沒有幫助。

什麼是正確的方式,我可以實現這個委託只用於我的一個viewcontrollers?

+0

錯誤代碼請! – CodaFi 2012-01-12 05:18:31

回答

6

viewDidUnload不一定會永遠被調用(它主要是用於處理內存不足的情況),並通過時間dealloc被調用時,視圖控制器可能不再包含在導航控制器,所以self.navigationControllernil

我建議在您的viewWillDisappear:實施(並將其設置爲viewWillAppear:而不是viewDidLoad)中將代理設置爲nil

順便說一句,你看到這裏的內存泄漏完全相反。內存泄漏將成爲無法再到達的內存,永遠不會被釋放。在這裏你已經釋放了內存(你的視圖控制器),但仍然被(懸掛)指針引用,導致崩潰。真正的泄漏通常不會直接導致事故。

+3

請記住,當另一個視圖控制器被push時,'viewWillDisappear:'也會被髮送,所以這可能不是你真正想要的。 – Costique 2012-01-12 05:26:03

+0

這是一個很好的觀點。 – omz 2012-01-12 05:33:52

4

當導航控制器將要彈出控制器時,您應該保留導航控制器的弱(非保留)參考或重置其委託。事實是,在deallocself.navigationController已經爲零,並且viewDidUnload不會在控制器彈出時發送。

0

您應該設置代理自己在您的[viewDidAppear:]實施中,並且設置代理在您的[viewWillDisappear:]實施中爲零。

提示:不應該在dealloc實現中設置委託爲零,因爲調用dealloc時,viewController會從navigationcontroller棧中彈出,因此self.navigationController必須爲零。