2013-03-21 128 views
1

我的初始視圖控制器使用performSegue:withIdentifier方法,其反過來使用同一performSegue:withIdentifier方法加載一些其它控制器中的另一個視圖控制器。故事板控制器不解除分配故事板負載

但是,初始視圖控制器和第二個視圖控制器都不釋放。他們都傾向於通過工具看到的參考計數爲1。

我需要在用戶退出應用程序時將用戶發回第一個控制器。我迄今爲止唯一的方法是使用performSegue:withIdentifier方法並將用戶發送回初始控制器。

但是,對我而言,以前的控制器將不會被釋放。因此,導致再創造相同的視圖控制器。

因爲我需要註銷用戶返回到第一個屏幕,我要確保所有以前的視圖控制器已被釋放。

回答

4

當您執行推式或模態時,它不會(也不應該)釋放您正在尋找的視圖控制器。它需要保持它,以便當你彈出/解散它時,它仍然會在那裏。此規則的例外情況是使用拆分視圖控制器並使用替換segue時。但這是一個特例。

如果您想回到第一個場景,如果您使用的是導航控制器並且只使用push segues,則可以使用popToRootViewControllerAnimated。 (對於iOS 5的目標,我會一直使用導航控制器,並且如果我不想讓導航欄看到它,就會隱藏導航欄。出於這個原因,可以很方便地彈出多個層次,實現相同的效果非常麻煩)在iOS 6中,您可以使用unwind segue,您可以在其中彈出/關閉任意數量的場景,例如返回到您的初始場景。

0

在iOS 6之前A UIViewController將保持活着狀態,但其更爲昂貴的UIView將被釋放以節省內存。與UIView相比,UIViewController本身非常輕。 由於iOS 6中,你應該根據文檔覆蓋didReceiveMemoryWarning

Google文檔UIViewController

內存管理

內存是iOS中的關鍵資源,視圖控制器提供 內置支持減少他們的內存足跡在關鍵 次。 UIViewController類通過它的didReceiveMemoryWarning方法提供了一些 低內存條件的自動處理, 釋放了不需要的內存。

在iOS 6之前,當發生低內存警告時,如果UIViewController類知道它可以重新加載,或者在稍後再次重新創建它們,它將清除其視圖。如果發生這種情況,它又稱 viewWillUnload和viewDidUnload方法給你的代碼有機會 放棄與您的觀點 層次結構相關聯的任何對象,包括從筆尖文件加載對象的所有權,創造 對象在viewDidLoad方法,以及在運行時緩慢創建的對象以及添加到視圖層次結構中的對象 。在iOS 6上,視圖永遠不會被清除,並且這些方法從不會被調用。如果您的視圖控制器需要 在內存不足時執行特定任務,它應該覆蓋 didReceiveMemoryWarning方法。

只要你管理你正確的反應(取決於iOS版本)和dealloc視圖,我看到這裏沒有問題。

2

performSegue循環是不是一個好主意..

如果你必須回到你的VC層次,您應該使用UINavigationController與推動/坡平風險投資,或呈現/解僱模態VC。您可以通過模態地呈現UINavigationController來組合這兩者。

+0

+1同意。至少有兩個例外:首先,在iOS 6中,您可以執行一個展開順序的「performSegue」。其次,如果使用分割視圖控制器的替換segue,它同樣沒有關係。但是你絕對正確,你永遠不需要一套循環推/模態的賽段。 – Rob 2013-03-21 14:52:32

+0

感謝您確認我的想法。雖然你的答案更完整,所以+1。我以前沒有聽說過放鬆,而且看起來很不錯。快速回答你鏈接到的答案:在第3步中,你說「在視圖控制器A的.m中實現動作」,它不應該是B而不是A嗎? – rdurand 2013-03-21 15:12:53

+0

不可以,不可以。您可以在視圖控制器中定義放鬆動作,以便放鬆(否則,如果您有一打以前的場景,它將如何知道哪一個?)。 IB確定所有先前的場景及其相關的視圖控制器,掃描.m文件進行放鬆操作,抓取這些名稱,並在最後一個場景中列出那些您嘗試添加放鬆繼續。順便說一下,這也是爲什麼我喜歡給我放鬆行爲有意義的名字,以便當你使用它們時,你可以清楚地知道你正在展開的場景。 – Rob 2013-03-21 15:18:44