为什么 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!