2012-05-03 146 views
2

我的一個UIViewController有幾個子視圖控制器。它們是在界面構建器內部構建的,通過拖動NSObject到左側的「Objects」部分,然後將我自己的SpecialViewController作爲「Custom Class」。有了這個設置,在viewDidLoad我會有我的意見和控制器準備好。工作流是通過下面的截圖提示:正確處理didReceiveMemoryWarning

Drag "Object" to create instance

而且在我的實現,我有:

@interface ParentController : UIViewController 
{ 
    SpecialViewController *svc; 
} 
@property (nonatomic, retain) IBOutlet SpecialViewController *svc; 

正如我明白,在我didReceiveMemoryWarning應該釋放自己的資源。然後在viewDidUnload期間將IBOutlets設置爲零。

我得到崩潰在模擬器模擬內存不足的時候,用調試器在SpecialViewControllerdidReceiveMemoryWarning(屍體只是[super didReceiveMemoryWarning];)暫停,錯誤EXC_BAD_ACCESS (code=1, address=0xe0000008)。此時,父控制器不可見,因此可以安全地釋放。

父控制器在didReceiveMemoryWarning中也只包含[super didReceiveMemoryWarning];。我已經在兩個班都嘗試過niling IBOutlets。它沒有幫助。

任何想法爲什麼發生這種情況?

我使用ARC針對iOS 4 & 5。 SpecialViewControllerUITableViewController的一個子類。

通過跟蹤,我發現ParentController didReceiveMemoryWarningSpecialViewController之前被調用。

+1

釋放對象並將對象設置爲零不相等。如果你收到記憶警告,你必須釋放**未使用的**資源。先嚐試'[svc release]'。 – Feo

+1

@Feo,嗯......我正在使用ARC。我確實釋放了未使用的資源。那些是我在我自己的班級中管理的,對嗎? –

+0

你在做'self.scv = nil'嗎? – Peres

回答

2

看起來好像你在這裏有一個視圖控制器的視圖控制器。有沒有什麼特別的理由讓你選擇像這樣創建類?根據我的經驗,每個UIViewController應該是一個單獨的子類。根據您的錯誤出現在didReceiveMemoryWarning這一事實,我認爲這個問題在別處。你能分享你的這個視圖控制器的初始化代碼嗎?

如果您試圖使用UIViewController Containment之類的東西,您應該查看涵蓋此過程的WWDC主題。

+0

我不知道這是一個奇怪的方法。 ''initWithNibName''方法除了調用super之外沒有任何其他功能。我記得在某處看到了這種方法,但現在無法真正獲得鏈接。它是這樣設計的,因爲UI有3個不同的表格視圖,儘管它們不是同時顯示。糟糕的設計? –

+0

是的,很可能是一個糟糕的設計。如何在1個UIViewController中包含3個UITableViews。以編程方式切換3個UITableView中的2個隱藏屬性以顯示正確的屬性。 – Sam

+0

你的意思是我應該沒有啓動3''UITableViewControllers''呢?只需通過我自己的代表分別管理它們?啊,我知道了。我不應該使用額外的控制器。我只需要代表。謝謝。我會修改我的代碼,並希望儘快接受您的答案。 –

2

視圖控制器的didReceiveMemoryWarning默認實現將釋放它們的視圖;您的責任僅限於發佈在viewDidLoadloadView中創建的任何其他視圖,以及對IBOutlet子視圖的任何強烈引用。

您對另一個視圖控制器有強烈的參考,當視圖再次可見時,將不會再創建。你應該不是使用didReceiveMemoryWarning來釋放你的sec實例變量;相反,依靠SpecialViewControllerdidReceiveMemoryWarning實施來照顧釋放它的視圖。

在實踐中,我使用didReceiveMemoryWarning釋放我主視圖(self.view),並使用viewDidUnload以釋放viewDidLoad創造任何東西。我發現這些方法的名稱和它們的用法是平衡的。如果您在viewDidLoad中創建了一些內容,請在viewDidUnload中發佈。

+0

實際上,如果我不用'IBOutlets',它會以同樣的方式崩潰。我認爲niling進程只是爲了保護我自己的代碼。理論上沒有必要,對嗎?但我的觀點是控制器嵌入在.xib中。我沒有在''viewDidLoad''中創建它們。 –

+0

它們沒有被釋放,所以你釋放盡可能多的內存(設置爲無釋放任何以前的實例)。由於您的目標是iOS 4,因此您沒有對弱引用進行調零,因此可能會發佈一個變量而不將其引用設置爲nil。你確定你沒有在視圖控制器中發佈'svc'嗎?你是否在任何地方使用'NSNotificationCenter'?我在iOS 4中看到了導致問題的原因。 –

+0

在ARC plus下,該對象是在.xib中創建的,我不認爲我可以真正釋放它。我無法致電發佈。但就像我說的,無論是否無效都是一樣的。 ''didReceiveMemoryWarning''什麼也不做。它沒有得到''viewDidUnload''。 –