我注意到view
的{{1}}属性不是UIViewController
类型,而是UIView?
(即不是可选的)。这是为什么?在没有加载时,UIViewController的视图是不是应该是UIView
?
官方文档说明如下:
存储在此属性中的视图表示视图控制器的视图层次结构的根视图。 此属性的默认值为nil。 .... 在低内存条件下以及最终释放视图控制器本身时,UIViewController类可以自动将此属性设置为nil。
根据我对Swift选项的理解,nil
似乎应该声明为view
,因为它在某些时候可能是var view: UIView?
。 Apple似乎反过来说,你能解释一下我的原因吗?
您怎么看?
答案 0 :(得分:3)
看起来view
是一个惰性属性(但不使用lazy
修饰符) - 实际上如果你读取内联注释(cmd +点击view属性来打开源代码)它表示:
如果视图尚未设置,则getter首先调用[self loadView]。如果子类覆盖了setter或getter,则子类必须调用super。
和约loadView()
:
如果子类没有使用nib,那么子类应该创建自定义视图层次结构。永远不应该直接打电话。
我认为:
所以它的实现应该在概念上类似于:
private var _view: UIView?
var view: UIView {
if _view == nil {
loadView()
}
return _view!
}
func loadView() {
if _view == nil {
// _view = something()
}
}
答案 1 :(得分:0)
该物业在技术上并非零。它在第一次访问属性时初始化视图。它被称为lazy loading。这意味着,当您访问该房产时,您将获得一个价值。我认为这个属性的文档如果不正确就会产生误导。