0

這個問題是關於一個iPhone應用程序,它使用Xcode的主細節模板和核心數據。該應用程序支持iOS 5.1及以上版本。如何判斷我的視圖控制器是否會從內存中釋放?

我使用NSFetchedResultsController來管理一個UITableView這是我的UINavigationController堆棧中的第二視圖控制器的項目。用戶從表視圖中進行選擇,堆棧中的第三個視圖控制器被推送到視圖上。非常標準的東西,我很享受對NSFetchedResultsController提供的Core Data對象的簡化訪問。

一旦在第三視圖控制器,該用戶正在看一組從在表視圖的列表中選擇的數據。我在這個視圖中添加了幾個按鈕來導航到上一個或下一個數據集。想想iOS郵件應用程序和查看電子郵件時看到的向上/向下按鈕。您可以使用這些按鈕選擇列表中的下一個或上一個電子郵件,而無需導航回到電子郵件列表(表格視圖)。

我試圖找到最簡單的方法用於識別數據應從數據存儲加載當這些下一個/前一個按鈕中的一個被分接。據我所知,這是使用堆棧中前一個視圖控制器中的抓取結果控制器。我可以簡單地要求Core Data返回表視圖中下一個或上一個索引路徑的結果。

雖然在我的第三個(詳細信息)視圖控制器我能夠獲得進入第二(主)視圖控制器讀取的結果控制如下:

NSFetchedResultsController *fetch = [[self.navigationController.viewControllers objectAtIndex:1] fetchedResultsController]; 
NSIndexPath *indexPath = [fetch indexPathForObject:self.detailItem]; 
NSLog(@"Section: %d, Row: %d", indexPath.section, indexPath.row); 

我去任何前進一步,我需要知道視圖控制器及其獲取的結果控制器將一直存在。據我瞭解,它將被保留,直到內存不足,此時它可能會被釋放。我的詳細信息視圖在顯示數據時可能消耗大量內存,並隨着應用程序用於隨時間收集更多數據而消耗越來越多。

我能肯定這些項目(在堆棧和讀取的結果控制一個視圖控制器)將留在存儲器中,而我的用戶與細節視圖控制器進行交互?

如果不是,我有沒有辦法確保它們被保留?

否則,有沒有更簡單或更優雅的方式來達到目的?

回答

0

你的第二個視圖控制器永遠不會被釋放。也不是在低內存的情況下。可能發生的情況是在低內存情況下調用viewDidUnload(已棄用且不再在iOS 6中調用)。所以只要你不用那種方法擺脫你的NSFetchedResultsController,你應該沒問題。

+0

那如果真的是很讓人放心!有什麼你可以指出(在文檔等),確認它?謝謝。 – beev

+0

首先保留'viewControllers'屬性(具有'copy')。因此,所有在導航控制器中推送的視圖控制器都將被保留,並且保留的對象不會被釋放。如果它釋放這些控制器,它會產生一個巨大的問題,因爲當你回到解除分配的控制器時,你的應用程序會做什麼? – lammert

0

你可以知道什麼時候調用此方法:

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
相關問題