2011-04-03 34 views
1

因此,在內存不足的情況下,我的根視圖被卸載。這是預料之中的事情。但是,如何處理需要彈出的模式/推式視圖控制器,因爲它們引用主navigationController?我在推視圖控制器中有一個自定義完成按鈕,它調用[self.navigationController popViewControllerAnimated:YES]。如果根視圖已被卸載,則會導致訪問錯誤。有一個更好的方法嗎?防止在uinavigationcontroller設置中popViewControllerAnimated的訪問不良崩潰

我的設置是 AppDelegate中有一個NavigationController 這NavigationController有MainViewController

//MainViewController.m 
- (IBAction)showAnotherController:(id)sender 
{ 
    AnotherViewController * anotherViewController; 
    anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; 

    [self.navigationController pushViewController:anotherViewController animated:YES]; 
    [anotherViewController release]; 
} 

//...Here I can simulate a memory warning to force unloading of MainViewController's view 

//in AnotherViewController.m, called from a custom toolbar item 
- (IBAction)done:(id)sender 
{ 
    [self.navigationController popViewControllerAnimated:YES]; // bad access here, looks like self.navigationController is no longer available. Am I doing this wrong? 

} 
+0

viewDidUnload方法只是卸載視圖控制器的視圖,而不是視圖控制器本身。根控制器必須在那裏。你可以發佈崩潰? – Jorge 2011-04-03 10:13:32

+0

的確如此。因爲self.navigationController不再存在,所以我只是在調試器卡在行[self.navigationController popViewControllerAnimated:YES]時得到一個EXC_BAD_ACCESS。 – akaru 2011-04-03 19:24:55

回答

2

您所描述的情況下不會引起不良訪問視圖控制器。但是,如果您不仔細處理所描述的情況,就會導致訪問不暢。既然你沒有告訴我任何代碼,我不能告訴你這是你遇到的問題,但這是一個非常普遍的問題。

當您收到內存警告並且您的視圖已卸載時,您可能會釋放一堆內容。除了釋放變量之外,還必須將它們設置爲零。如果你不這樣做,你將面臨將消息發送到釋放對象的風險,這會導致訪問不良。

同樣,我不知道這是你的問題,但它通常是問題所在。

編輯:既然你似乎認爲self.navigationController不存在(它可能做)我會告訴你什麼叫NSZombie:

NSZombie會告訴你什麼釋放的對象被髮送消息(又名EXC_BAD_ACCESS)。當您獲得EXC_BAD_ACCESS時,這是一個非常有用的工具,因此請了解如何使用它。

要激活NSZombie做到以下幾點:

  1. 獲取可執行的信息。
  2. 轉到參數選項卡。
  3. 在「變量在環境中進行設置:」部分添加:

名稱:NSZombieEnabled 值:是

然後運行你的應用程序像往常一樣,當它崩潰,它會告訴你哪個解除分配的對象收到消息。

+0

我在原始問題中增加了一些代碼。讓我知道這是否足夠。 – akaru 2011-04-03 19:29:52

+0

這不是我害怕的相關代碼。我對裝載和卸載視圖更感興趣。試試NSZombie並告訴我結果。 – 2011-04-03 22:02:51

+0

謝謝,夥計。這是我需要的建議。我應該嘗試的東西,但誤解了錯誤。使用NSZombieEnabled,我看到一些「[SomeUIControl autorelease]:發送到釋放實例的消息」錯誤。我認爲這可能是由於我的IBOutlets沒有爲他們設置相應的屬性。 – akaru 2011-04-04 03:26:54