为什么UIViewController的'view'属性在Swift中不是可选的?

Nic*_* B. 6 iphone uiviewcontroller uiview ios swift

我注意到view属性UIViewController不是类型UIView?,UIView而是(即不是可选的).这是为什么?是不是UIViewController的视图应该是nil什么时候没有加载?

官方文档说明如下:

存储在此属性中的视图表示视图控制器的视图层次结构的根视图.此属性的默认值为nil.....在低内存条件下以及最终释放视图控制器本身时,UIViewController类可以自动将此属性设置为nil.

根据我对Swift选项的理解,似乎view应该声明,var view: UIView?因为它可能nil在某个时候.Apple似乎反过来说,你能解释一下我的原因吗?

你怎么看?

Ant*_*nio 3

它看起来像是view一个惰性属性(但不使用修饰符lazy) - 事实上,如果您阅读内联注释(cmd+单击视图属性以打开源代码),它会说:

如果尚未设置视图,则 getter 首先调用 [self loadView]。如果子类重写 setter 或 getter,则必须调用 super。

以及关于loadView()

如果子类不使用笔尖,则应在此处创建自定义视图层次结构。永远不应该直接调用。

我认为:

  • 如果未实例化,标准实现将创建一个空视图
  • 它由可选变量支持(不可公开访问)
  • 在内存不足的情况下,后备变量设置为 nil,释放视图实例
  • 如果您尝试在支持变量为零时访问该属性,它将创建一个新实例

所以它的实现在概念上应该类似于:

private var _view: UIView?

var view: UIView {
    if _view == nil {
        loadView()
    }
    return _view!
}

func loadView() {
    if _view == nil {
        // _view = something()
    }
}
Run Code Online (Sandbox Code Playgroud)