4

当我们收到内存不足警告时,我们释放所有视图,将 outlet 设置为 nil,然后重新创建它们。但是对于在界面构建器中添加的视图,它们仅在我们调用 initWithNibName 时添加。

那么,通过界面构建​​器使用大量视图通常是不好的做法,还是由原始UIViewController实现自动处理didReceiveMemoryWarning(iOS 6+) or viewDidUnload (iOS 5 and below)

4

1 回答 1

1

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 或其他一些持久性(磁盘缓存等)方式中。

下次访问视图属性时,视图将完全按照第一次时的方式重新加载。从图形上看,它很有意义-

在此处输入图像描述

[资源]

于 2013-07-11T09:34:10.727 回答