当我们收到内存不足警告时,我们释放所有视图,将 outlet 设置为 nil,然后重新创建它们。但是对于在界面构建器中添加的视图,它们仅在我们调用 initWithNibName 时添加。
那么,通过界面构建器使用大量视图通常是不好的做法,还是由原始UIViewController
实现自动处理didReceiveMemoryWarning(iOS 6+) or viewDidUnload (iOS 5 and below)
?
当我们收到内存不足警告时,我们释放所有视图,将 outlet 设置为 nil,然后重新创建它们。但是对于在界面构建器中添加的视图,它们仅在我们调用 initWithNibName 时添加。
那么,通过界面构建器使用大量视图通常是不好的做法,还是由原始UIViewController
实现自动处理didReceiveMemoryWarning(iOS 6+) or viewDidUnload (iOS 5 and below)
?
a 的默认行为viewcontroller
是在第一次访问视图属性时加载其视图层次结构,然后将其保存在内存中,直到视图控制器被释放。没有迹象表明使用代码创建的视图与在 Interface Builder 中创建的视图不同。由于应用程序维护,我个人更喜欢 InterfaceBuilder,因为 UI 代码变得非常复杂,并且将 UI 元素与 UI 元素的功能方面分离是一个干净的分叉,使新程序员可以轻松维护您的代码库。
但是在释放内存时,didReceiveMemoryWarning
如果您的应用需要额外的内存,委托将用于显式释放视图层次结构。
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Add code to clean up any of your own resources that are no longer necessary.
if ([self.view window] == nil)
{
// Add code to preserve data stored in the views that might be
// needed later.
// Add code to clean up other strong references to the view in
// the view hierarchy.
self.view = nil;
}
return;
}
注意这里我们测试视图控制器的视图是否不在屏幕上。如果视图与窗口相关联,则它会清除视图控制器对视图及其子视图的任何强引用。如果视图存储了需要重新创建的数据,则此方法的实现应在释放对这些视图的任何引用之前保存该数据。通过存储,您可以将其作为先前视图控制器内存的一部分保存在内存中,或者将其存储在 coredate 或其他一些持久性(磁盘缓存等)方式中。
下次访问视图属性时,视图将完全按照第一次时的方式重新加载。从图形上看,它很有意义-