8

奇怪的是,在 Big Nerd Ranch iOS 5 book (p.73) 和 Programming iOS 5 book (O'Reilly, p.314) (updadte: even Kochan's Objective-C book Fourth edition)中,在 ARC 的上下文中,他们说 properties 属性的默认值是assign... 但是Apple 的文档说默认值是strong.

我还尝试了一个简单的程序,如果我不指定strong,程序可以正常工作,如果我指定strong,它的工作方式相同,而当assign使用时,编译器会显示警告,所以看起来默认确实是strong.

所以如果大多数时候,我们想要

@property (nonatomic, readwrite, strong) NSMutableArray *foo;

然后我们可以写

@property (nonatomic) NSMutableArray *foo;

因为其他两个 (readwritestrong) 是默认值?

4

2 回答 2

11

readwrite 和 strong,确实是 ARC* 下的默认值。在手动引用计数下,assign 是(是)默认值。我更喜欢明确指定这些,因为它更清楚@property 的参数是什么,而不是依赖阅读代码的人知道默认值是什么。

*strong 是默认值,假设您让编译器为您合成一个实例变量,或者声明了一个没有显式所有权限定符的实例变量(在这种情况下,ivar__strong无论如何都是默认的)。否则,默认属性所有权类型与 ivar 声明中的所有权限定符匹配。因此,如果您使用 显式声明 ivar __weak,然后为其声明 @property 而没有所有权限定符,则合成属性将很弱。这一切都记录在Clang ARC 文档中。

于 2012-06-14T21:10:16.653 回答
0

默认情况下,对象属性是strong, atomic, readwrite. 请参阅 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

于 2015-06-14T21:05:54.043 回答