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