为什么Xcode不会使网点无主而不是弱?

时间:2017-07-22 19:52:40

标签: ios swift xcode weak-references iboutlet

Xcode通过隐式展开产生出口作为弱变量,如下所示:

@IBOutlet weak var nameTextField: UITextField!

我想知道为什么它不能仅仅onowned var,这在我的理解中 -  行为完全相同,但保持类型不可选。这两者有什么区别吗?

weak var foo: UITextField!
unowned var foo: UITextField

5 个答案:

答案 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!