如何判断我的视图控制器是否会从内存中释放?

时间:2012-11-14 12:24:18

标签: iphone ios uitableview uinavigationcontroller nsfetchedresultscontroller

此问题是针对使用Xcode的Master Detail模板和Core Data的iPhone应用程序。该应用程序支持iOS 5.1及更高版本。

我正在使用NSFetchedResultsController来管理UITableView中的项目,UITableView是我的UINavigationController堆栈中的第二个视图控制器。用户从表视图中进行选择,并将堆栈中的第三个视图控制器推送到视图上。非常标准的东西,我很享受NSFetchedResultsController提供的对Core Data对象的简化访问。

进入第三个视图控制器后,用户正在查看从表格视图中的列表中选择的一组数据。我在此视图中添加了几个按钮,用于导航到上一组或下一组数据。想想iOS Mail应用程序以及查看电子邮件时看到的向上/向下按钮。您可以使用这些按钮选择列表中的下一封或上一封电子邮件,而无需导航回电子邮件列表(表格视图)。

当我点击其中一个下一个/上一个按钮时,我试图找到最简单的方法来识别应该从数据存储中加载哪些数据。据我所知,这是使用堆栈中前一个视图控制器的获取结果控制器。我可以简单地要求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);

在进一步讨论之前,我需要知道视图控制器及其获取的结果控制器将始终存在。据我了解,它将保留,直到内存不足,此时它可以被释放。我的详细信息视图在显示数据时会消耗大量内存,并且随着应用程序用于随时间收集更多数据而消耗的内容会越来越多。

当我的用户与详细视图控制器交互时,我能确定这些项目(堆栈中的前一个视图控制器及其获取的结果控制器)是否会保留在内存中?

如果没有,我有办法确保他们被保留吗?

否则,是否有更简单或更优雅的方式来实现目标?

2 个答案:

答案 0 :(得分:0)

您的第二个视图控制器永远不会被释放。在低内存情况下也不会。可能发生的是在低内存情况下调用viewDidUnload(在iOS 6中不再使用并且不再调用)。所以,只要你没有在那个方法中摆脱你的NSFetchedResultsController,你应该没事。

答案 1 :(得分:0)

您可以知道此方法何时调用:

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