为什么 Xcode 不让 outlets 成为无主而不是 weak?
Why doesn't Xcode make outlets unowned instead of weak?
Xcode 将 outlets 生成为具有隐式展开的弱变量,如下所示:
@IBOutlet weak var nameTextField: UITextField!
我想知道为什么它不只是 onowned var
,这在我的理解中 -
行为完全相同,但保持类型非可选。这两者有什么区别吗?
weak var foo: UITextField!
unowned var foo: UITextField
一个weak
变量有一个默认值,即nil
,所以你的代码是合法的,因为出口属性在对象创建时有一个值(在 插座实际连接之前)。
但是 unowned
变量没有默认值,您的代码将无法编译。试试吧。
而且整个概念都是错误的。 unowned
是为了一个有保证的独立存在的东西,你离不开它。视图控制器视图的子视图不满足这两个条件。
是的,有区别。除了默认值问题,还有一种方法可以检查 weak
值当前是否存在:
if let nameTextField = nameTextField {
// do smth
}
另一方面,我认为没有办法检查 unowned
是否存在以及访问是否有效。每当使用 unowned
时,它就应该始终存在,但在 IBOutlet
的情况下并非如此。在从情节提要中加载视图控制器之前,不会设置插座。
希望对您有所帮助!
无主类型很危险,最好避免使用。无主变量等同于 Objective C unsafe_unretained 类型。
如果无主引用指向的对象被释放,则无主引用不会被设置为 nil。如果您稍后尝试引用该对象,您的代码将无法判断它是否仍然有效。如果您尝试调用方法或 read/write 实例变量,如果对象已被释放,您可能会崩溃。
(然后事实是变量没有默认值,正如马特在他的回答中所说的那样。)
unowned var foo: UITextField
应该在view controller初始化的时候初始化,但这是不可能的,因为outlet只有在view创建之后才能初始化,而view只有在view controller显示时才创建(更准确地说是view
属性 被访问)。
以前是optionals不能unowned
。现在这是可能的,所以 unowned
是合适的。这可能不会自动完成,因为它会让某些人感到困惑。
@IBOutlet private unowned var uiObject: UIObject!
Xcode 将 outlets 生成为具有隐式展开的弱变量,如下所示:
@IBOutlet weak var nameTextField: UITextField!
我想知道为什么它不只是 onowned var
,这在我的理解中 -
行为完全相同,但保持类型非可选。这两者有什么区别吗?
weak var foo: UITextField!
unowned var foo: UITextField
一个weak
变量有一个默认值,即nil
,所以你的代码是合法的,因为出口属性在对象创建时有一个值(在 插座实际连接之前)。
但是 unowned
变量没有默认值,您的代码将无法编译。试试吧。
而且整个概念都是错误的。 unowned
是为了一个有保证的独立存在的东西,你离不开它。视图控制器视图的子视图不满足这两个条件。
是的,有区别。除了默认值问题,还有一种方法可以检查 weak
值当前是否存在:
if let nameTextField = nameTextField {
// do smth
}
另一方面,我认为没有办法检查 unowned
是否存在以及访问是否有效。每当使用 unowned
时,它就应该始终存在,但在 IBOutlet
的情况下并非如此。在从情节提要中加载视图控制器之前,不会设置插座。
希望对您有所帮助!
无主类型很危险,最好避免使用。无主变量等同于 Objective C unsafe_unretained 类型。
如果无主引用指向的对象被释放,则无主引用不会被设置为 nil。如果您稍后尝试引用该对象,您的代码将无法判断它是否仍然有效。如果您尝试调用方法或 read/write 实例变量,如果对象已被释放,您可能会崩溃。
(然后事实是变量没有默认值,正如马特在他的回答中所说的那样。)
unowned var foo: UITextField
应该在view controller初始化的时候初始化,但这是不可能的,因为outlet只有在view创建之后才能初始化,而view只有在view controller显示时才创建(更准确地说是view
属性 被访问)。
以前是optionals不能unowned
。现在这是可能的,所以 unowned
是合适的。这可能不会自动完成,因为它会让某些人感到困惑。
@IBOutlet private unowned var uiObject: UIObject!