繁体   English   中英

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

[英]Why is the 'view' property of UIViewController not optional in Swift?

我注意到UIViewControllerview属性不是UIView?类型的UIView? 但相反UIView (即不是可选的)。 这是为什么? UIViewController的视图在未加载时应该是nil吗?

官方文档说明如下:

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

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

你怎么看?

看起来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()
    }
}

该物业在技术上不是零。 它在第一次访问属性时初始化视图。 它被称为延迟加载 这意味着,当您访问该房产时,您将获得一个价值。 我认为这个属性的文档有误导性甚至不正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM