我记得在Xcode 5中,如果您将视图从情节提要拖到代码中,它将创建一个具有属性的weak
属性。现在在Xcode 6中它unsafe_unretained
用作默认值。这种变化的原因可能是什么?
3 回答
如维基百科所述:
清零弱引用仅在 Mac OS X 10.7“Lion”或更高版本和 iOS 5 或更高版本中可用,因为它们需要来自 Objective-C 运行时的额外支持。使用 ARC 但需要支持早于 Mac OS X Lion 或 iOS 5.0 的操作系统版本的代码不能使用归零弱引用,因此必须使用 unsafe_unretained 弱引用
您的项目部署目标 iOS 应该是 iOS 5 之前的东西(可能是 iOS 4.0)。因此,Xcode 正在创建 unsafe_unretained 而不是 week,因为您的应用程序应该在 iOS 4 或更早版本的 iOS 上运行。
强引用(您将在大多数情况下使用)意味着您想要“拥有”您使用此属性/变量引用的对象。只要您(或任何其他对象)使用强引用指向它,编译器就会注意您分配给此属性的任何对象都不会被破坏。只有将属性设置为 nil 后,对象才会被销毁(除非一个或多个其他对象也持有对它的强引用)。
相反,使用弱引用表示您不想控制对象的生命周期。您弱引用的对象仅存在,因为至少有一个其他对象持有对它的强引用。一旦不再是这种情况,对象就会被销毁,并且你的弱属性将自动设置为 nil。iOS 中最常见的弱引用用例是:
- 委托属性,通常被弱引用以避免保留循环,以及
- 视图控制器的主视图的子视图/控件,因为这些视图已经被主视图强持有。
unsafe_retained 与弱相同,而保留与强相同。
weak
属性就像unsafe_unretained
它们工作得更聪明一点。当分配给该属性的对象被释放时,weak
引用自动变为nil
避免在向该对象(其内存地址)发送消息时崩溃。Unsafe_unretained
属性不这样做。它们将始终保留分配给它的内存地址(除非您手动更改它),而不管与该地址关联的对象如何。在这种情况下,弱引用可以防止崩溃,但结果仍然不会像预期的那样。如果您的代码编写良好且组织良好,则不应该发生这种情况。
难怪苹果是否将插座属性设置为unsafe_unretained
.