背景:
我有一个标签栏应用程序。每个选项卡都包含导航控制器,允许用户从一个视图转换到另一个视图,显示数据的深入信息(每个视图都由视图控制器处理,每个视图控制器类都有didReceiveMemoryWarning
方法)。通过从 Web 服务中提取数据来填充列表。
Problem:
当我使用iPhone模拟器的“硬件>模拟内存警告”选项时,didReceiveMemoryWarning
我的所有视图控制器都会调用该方法 - 即使是用户正在查看的视图控制器。我不想清除活动视图控制器正在使用的任何内容。我怎样才能做到这一点?
哪个方法应该实现在内存警告释放数据后重新加载数据? (我看到包含表视图调用的视图控制器类viewDidLoad
当用户返回到该视图时的方法,但如果该视图包含(例如 UIWebView),则viewDidLoad
方法未被调用。这是为什么?)
已编辑(2009 年 1 月 30 日星期五 - 下午 03:10)
(注意:我使用界面生成器来创建视图,并且loadView
方法已被注释掉。)
因此,当视图控制器收到内存警告消息时,将执行以下步骤:
-
调用以下方法:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
由于致电[super didReceiveMemoryWarning]
, [self setView:nil]
被自动调用?
如果需要清除任何资源,那么setView
应重写方法以清除本地资源。
[self setView:nil]
如果视图当前处于活动状态(默认情况下),则不会调用。正确的? - 我真的很好奇哪种方法会做出这个决定以及如何做出?
能否请您确认一下。另外,我按照这种方法遇到了错误,但添加myObject = nil
释放后myObject
in dealloc
控制器类的方法解决了这个问题。谢谢。
这是一个老问题,但我没有看到正确的答案,所以这里是:
当收到内存警告时,-didReceiveMemoryWarning
在所有视图控制器中被调用,无论它们是否是“当前”视图控制器。视图控制器只是监听内存警告事件广播。
如果在出现内存警告时视图控制器的视图未被使用,控制器将通过将该属性设置为 nil 来卸载它。它如何知道视图是否被使用?按视图的-superview
财产。如果view.superview
为零,该视图不属于任何树,可以安全卸载。
一旦发生这种情况,控制器的-viewDidUnload
被叫。这是卸载任何插座以及将在其中重新创建的任何内容的正确位置-viewDidLoad
.
那么什么是-didReceiveMemoryWarning
为了?您的控制器可能具有在访问之前不会实例化的对象。例如,您可能有一个控制器,有时需要文件中的大量数据,但并非总是如此。您可以为其设置一个属性,如下所示:
- (NSData*)bigChunkOfData {
// Get data from our instance variable _data, read from disk if necessary
if (_data == nil) {
_data = [[NSData alloc] initWithContentsOfFile:@"/path/to/data"];
}
return _data;
}
这将第一次从磁盘读取数据,然后将其保存在实例变量中。自从_data
变量是按需创建的,我们在内存不足的情况下卸载它是安全的:下次我们需要它时它会再次创建。
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
[_data release];
_data = nil; // <-- Very important: don't leave strong references dangling.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)