如何判断我的视图控制器是不是会从内存中释放?
Posted
技术标签:
【中文标题】如何判断我的视图控制器是不是会从内存中释放?【英文标题】:How can I tell if my view controller will be released from memory?如何判断我的视图控制器是否会从内存中释放? 【发布时间】:2012-11-14 12:24:17 【问题描述】:这个问题是针对使用 Xcode 的 Master Detail 模板和 Core Data 的 iPhone 应用程序。该应用支持 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);
在我继续之前,我需要知道视图控制器及其获取的结果控制器将始终存在。据我了解,它将一直保留到内存不足时才可以释放。我的详细视图在显示其数据时可能会消耗大量内存,并且随着时间的推移,应用程序用于收集更多数据时会消耗越来越多的内存。
当我的用户与详细视图控制器交互时,我能否确定这些项目(堆栈中的前一个视图控制器及其获取的结果控制器)将保留在内存中?
如果没有,我有办法确保它们被保留吗?
否则,我是否有更简单或更优雅的方式来实现目标?
【问题讨论】:
【参考方案1】:你的第二个视图控制器永远不会被释放。也不是在内存不足的情况下。可能发生的情况是,viewDidUnload
(在 iOS 6 中已弃用且不再调用)在内存不足的情况下被调用。因此,只要您不以这种方法摆脱 NSFetchedResultsController
就应该没问题。
【讨论】:
如果是真的,那就太让人放心了!您有什么可以指出的(在文档等中)可以确认的吗?谢谢。 首先保留viewControllers
属性(有copy
)。因此,所有推送到导航控制器中的视图控制器都被保留,并且保留的对象永远不会被释放。如果它会释放这些控制器,则会产生一个巨大的问题,因为当您导航回已释放的控制器时,您的应用会做什么?【参考方案2】:
你可以知道这个方法什么时候调用的:
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
【讨论】:
以上是关于如何判断我的视图控制器是不是会从内存中释放?的主要内容,如果未能解决你的问题,请参考以下文章