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

时间:2014-09-18 09:50:26

标签: ios iphone uiview uiviewcontroller swift

我注意到view的{​​{1}}属性不是UIViewController类型,而是UIView?(即不是可选的)。这是为什么?在没有加载时,UIViewController的视图是不是应该是UIView

官方文档说明如下:

  

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

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

您怎么看?

2 个答案:

答案 0 :(得分:3)

看起来view是一个惰性属性(但不使用lazy修饰符) - 实际上如果你读取内联注释(cmd +点击view属性来打开源代码)它表示:

  

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

和约loadView()

  

如果子类没有使用nib,那么子类应该创建自定义视图层次结构。永远不应该直接打电话。

我认为:

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

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

private var _view: UIView?

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

func loadView() {
    if _view == nil {
        // _view = something()
    }
}

答案 1 :(得分:0)

该物业在技术上并非零。它在第一次访问属性时初始化视图。它被称为lazy loading。这意味着,当您访问该房产时,您将获得一个价值。我认为这个属性的文档如果不正确就会产生误导。