繁体   English   中英

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

[英]Why doesn't Xcode make outlets unowned instead of weak?

Xcode 将出口生成为具有隐式解包的弱变量,如下所示:

@IBOutlet weak var nameTextField: UITextField!

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

weak var foo: UITextField!
unowned var foo: UITextField

weak变量有一个默认值,即nil ,所以你的代码是合法的,因为 outlet 属性在对象创建时(实际连接 outlet之前)有一个值。

但是unowned变量将没有默认值,您的代码将无法编译。 试试吧。

整个概念也是错误的。 unowned是一个有保证的独立存在的东西,你不能没有它。 视图控制器视图的子视图不满足这两个条件。

是的,有区别。 除了默认值问题,还有一种方法可以检查weak值当前是否存在:

if let nameTextField = nameTextField {
    // do smth
}

另一方面,我认为没有办法检查unowned是否存在并且可以访问。 每当使用unowned ,它应该总是在那里,这在IBOutlet的情况下并非如此。 在从故事板加载视图控制器之前,不会设置插座。

希望这有帮助!

无主类型是危险的,最好避免。 无主变量等同于 Objective C 的 unsafe_unretained 类型。

如果无主引用指向的对象被释放,则无主引用不会被设置为 nil。 如果您稍后尝试引用该对象,您的代码将无法判断它是否仍然有效。 如果您尝试调用方法或读/写实例变量,如果对象已被释放,您可能会崩溃。

(然后事实是变量没有默认值,正如马特在他的回答中所说。)

unowned var foo: UITextField应该在视图控制器初始化期间初始化,但这是不可能的,因为只有在创建视图之后才能初始化 outlet,并且只有在显示视图控制器时才创建视图(更准确地说是在访问view属性时)。

过去,选项不能是unowned 现在这是可能的,所以unowned是合适的。 这可能不会自动完成,因为它会使某些人感到困惑。

@IBOutlet private unowned var uiObject: UIObject!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM