0

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

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

一旦进入第三个视图控制器,用户正在查看从表视图中的列表中选择的一组数据。我在此视图中添加了几个按钮,用于导航到上一组或下一组数据。想想看电子邮件时看到的 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);

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

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

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

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

4

2 回答 2

0

你的第二个视图控制器永远不会被释放。也不是在内存不足的情况下。可能发生的情况是viewDidUnload(在 iOS 6 中已弃用且不再调用)在内存不足的情况下被调用。因此,只要您不摆脱NSFetchedResultsController这种方法,就可以了。

于 2012-11-14T12:27:40.357 回答
0

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
于 2012-11-14T12:32:13.593 回答