Xcode通过隐式展开产生出口作为弱变量,如下所示:
@IBOutlet weak var nameTextField: UITextField!
我想知道为什么它不能仅仅onowned var
,这在我的理解中 -
行为完全相同,但保持类型不可选。这两者有什么区别吗?
weak var foo: UITextField!
unowned var foo: UITextField
答案 0 :(得分:7)
weak
变量有一个默认值,即nil
,因此您的代码是合法的,因为outlet属性在对象创建时具有值(之前出口是实际连接)。
但unowned
变量没有默认值,您的代码也无法编译。试试吧。
整个概念也是错误的。 unowned
是一个保证独立存在的东西,你不能没有。视图控制器视图的子视图不满足这些视图。
答案 1 :(得分:1)
unowned var foo: UITextField
应该在视图控制器初始化期间初始化,但这是不可能的,因为只有在创建视图后才能初始化outlet,并且只有在显示视图控制器时才创建视图(更确切地说,当{{} 1}}访问属性)。
答案 2 :(得分:0)
是的,有区别。除了默认值问题之外,还有一种方法可以检查weak
值当前是否存在:
if let nameTextField = nameTextField {
// do smth
}
另一方面,我认为没有办法检查unowned
是否存在且有效访问。每当使用unowned
时,它应该始终存在,但在IBOutlet
的情况下则不然。在从故事板加载视图控制器之前,不会设置插座。
希望这有帮助!
答案 3 :(得分:0)
无主类型是危险的,最好避免。无主变量等同于Objective C unsafe_unretained类型。
如果释放了无主引用所指向的对象,则无主引用将不会设置为nil。如果您稍后尝试引用该对象,则您的代码无法判断它是否仍然有效。如果您尝试调用方法或读取/写入实例变量,则在释放对象时可能会崩溃。
(然后就是这个变量没有默认值,正如亚特在他的回答中所说的那样。)
答案 4 :(得分:0)
过去,可选项不能为unowned
。现在可以实现,因此unowned
是合适的。可能不会自动完成此操作,因为这会使人感到困惑。
@IBOutlet private unowned var uiObject: UIObject!