2

我有一個iPad應用程序,它有一個主視圖控制器,然後是一個設置視圖控制器。當我的主視圖呈現設置視圖時,我將全屏顯示設置視圖。在設置視圖中有一個解除按鈕,它可以工作 - 直到發生內存警告。如果在屏幕上顯示設置按鈕時發生內存警告,它將拒絕解除。內存警告是否破壞了呈現視圖控制器?

換句話說,這個工程:

  • 應用程序啓動 - >顯示主視圖 - >顯示設置查看 - >關閉設置查看

這不:

  • 應用程序啓動 - >顯示主視圖 - >顯示設置視圖 - >內存警告 - >關閉設置視圖

設置視圖將停留在那裏。

我在第一代iPad上的iOS 5上運行此應用程序。 (我不支持iOS 4.)

我該如何解決這個問題?

編輯:

這裏是我的代碼顯示設置視圖:

- (void) showSettings{ 

    if (!self.settingsViewController) { 

    //Create the navigation controller and the root view for the settings panel 
    SettingsViewController *settingsRootView = [[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *settingsView = [[UINavigationController alloc] initWithRootViewController:settingsRootView]; 
    [settingsRootView release]; 

    //Configure the animation and modal style, and the navigation bar's color 

    [settingsView.navigationBar setTintColor:kDarkGrayColor]; 

    //Enable the settings flag 
    [self setSettingsIsActive:YES]; 

    //Configure the presentation 
    [settingsView setModalPresentationStyle:UIModalPresentationFullScreen]; 
    [settingsView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

    self.settingsViewController = settingsView; 

    [settingsView release]; 
    } 

    //present and release the settings panel 
    [self presentViewController:self.settingsViewController animated:YES completion:^{ 

    }]; 

} 

這裏就是我如何隱藏:

//This method reloads some stuff and 
- (void) dismissSettings{ 

    // 
    // ... Reload some other stuff... 
    // 

    //Dismiss the settings panel 
    [self dismissViewControllerAnimated:YES completion:^{ 

    // 
    // ... Reload some other stuff... 
    // 

    }]; 
} 
+0

你發現了什麼給你記憶警告?你是否在做任何didReceiveMemoryWarning中做任何事情? – Rob 2012-01-27 13:50:00

+0

@Rob - 不要和不要。 – Moshe 2012-01-27 16:21:40

回答

4

原則上,內存警告對您的視圖控制器不起任何作用,但它會卸載那些當前未顯示在屏幕上的視圖控制器的視圖。

在您的具體情況下,我會從您的設置視圖控制器的代碼中查找任何可能引用主視圖控制器視圖中的內容的代碼。如果是這種情況,那麼在發生內存警告後,很可能引用將爲零。

此外,您應該驗證您的didReceiveMemoryWarning方法的實現,以查看您是否正在處理可能需要關閉該設置視圖的某些內容。

在內存不足的情況下,所有來自這些「非活動」視圖控制器的視圖都將被卸載。由於在主控制器上聲明瞭dismissSettings方法,所以在調用它時很有可能主視圖中的所有元素均爲零。我不知道「Reload some other stuff」代碼中包含了哪些操作,但我認爲與該視圖相關的一些事情正在使該方法失敗。

我建議將所有與視圖相關的重載代碼移動到viewDidAppear方法,因爲它將保證視圖已加載。另一方面,我會建議你在實際的設置視圖控制器上移動工具的解僱方法(記住它應該像[ self.navigationController dismissModalViewControllerAnimated:YES];那樣,因爲你需要關閉導航控制器)。至少,這是我一直這樣做的方式,從來沒有讓我失望。邏輯是我不希望不活動的視圖控制器運行任何邏輯。

最後,正如你所提到的你的目標是iOS 5及以上版本,我會極力推薦你的項目移到ARC。做起來比看起來容易,一旦你感動了,它確實很棒。

您的問題的另一個可能的原因是,您正在使用通知調用您的解僱方法,並且您的主控制器正在取消訂閱viewDidUnload方法上的通知。請記住,當低內存條件觸發時,將調用viewDidUnload方法!

+0

除了對超級實現 – Moshe 2012-01-27 14:24:03

+0

的調用,viewDidReceiveMemoryWarning方法中什麼也沒有,並且Settings View Controller是否有任何對Main View Controller的引用?另外,因爲大部分情況下,主視圖控制器的視圖都將被釋放,您應該從主視圖控制器驗證viewDidUnload方法內部的內容。 – flainez 2012-01-27 14:49:52

+0

不,不參考主視圖控制器。層次結構爲:主窗口 - >主視圖控制器 - >設置視圖控制器 – Moshe 2012-01-27 16:21:23

0

第一件事就是找出是什麼引起記憶警告。使用儀器並檢查是否有泄漏。如果你使用的是ARC,這應該是一個問題 - 但顯然有一些內存警告發生嚴重錯誤。解決這個問題,你已經解決了你的問題。

也就是說,當內存開始變短時,操作系統將關閉應用程序。後臺應用程序通常是第一個去的,但是很多時候,如果泄漏足夠糟糕,從後臺應用程序終止到運行應用程序終止的時間段可能很短。

相關問題