2011-04-13 102 views
4

我是新來的iOS,想知道如何正確實現視圖控制器卸載/重新加載。卸載/重新加載視圖控制器的正確方法

現在我的應用程序有一個NavigationController,它具有設置爲根視圖控制器的MainMenuViewController(自定義視圖控制器)。在應用程序生命週期中,新的ViewController在導航控制器上按下/彈出。這工作正常,第一次將它們推入堆棧時,會啓動相應的ViewController(來自NIB)。

但是,我現在要卸載一個特定的ViewController,當它被彈出時,然後重新加載它時再次推動它。

我已經添加了一個[self release]該ViewControllers viewDidDisappear:它卸載,但是當我嘗試再次推視圖,我得到一個消息發送到dealloc'ed實例錯誤和崩潰。因此,我的問題是:

  1. 這是一個正確的方式來卸載一個彈出的ViewController?
  2. 如何檢查給定的ViewController是否加載?
  3. 如何強制重新加載?用loadWithNib:,然後推入導航堆棧?

問候,

彼得

回答

3

歡迎的iOS編程。你的崩潰是一個內存管理問題。這可能需要你一點得到了它的竅門,但存儲管理變得比較容易的方式,如果你只是遵循一個規則:

對象需要釋放任何它保留(ALLOC相當於保留)

在這種情況下,你的視圖控制器正在釋放它本身,它絕對不會保留它自己。這裏的序列如何與導航控制器:

  1. 導航控制器與根視圖控制器(其堆棧中的第一個)初始化。讓我們打電話給這個firstViewController

  2. 用戶操作告訴firstViewController初始化secondViewController並將其推到導航控制器上。在大多數情況下,firstViewController將在推送後釋放secondViewController的實例。在這一點上,firstVC完成與​​。導航控制器正在保留​​

  3. 用戶觸摸​​導航欄上的後退按鈕。導航控制器將從堆棧彈出​​並釋放它。只要沒有其他物體保留它,​​就會被釋放。

  4. 現在用戶又回到firstVC。他們可以執行相同的用戶操作,該操作將啓動並推送​​的新實例。

希望能有所幫助。

我還建議您(重新)閱讀Apple文檔,並查看框架文檔中引用的示例代碼。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

+0

感謝對你的答案,但你給出的例子是我的情況太簡單了 - 我要決定哪些viewcontrollers到的dealloc,當(有時,甚至當它被彈出,我希望它保存它的狀態,所以當用戶返回時,它會立即引起)。現在我已經解決了這個問題,並設置了MainView控制器作爲通知中心的觀察者 - 而其他視圖控制器發佈通知,如果他們想要被解除分配或從堆棧中彈出。 – 2011-04-15 05:00:29

+0

我真的不知道你在做什麼,但我仍然會推薦閱讀和理解文檔。根據需要開始簡單並增加複雜性,事情正在發揮作用。祝你好運。 – XJones 2011-04-15 06:16:00

相關問題