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