在使用ARC的Objective-C中,我们通常只需要将非原子属性指定为属性属性吗?

nop*_*ole 8 objective-c automatic-ref-counting

奇怪的是,在Big Nerd Ranch iOS 5书(第73页)和编程iOS 5书(O'Reilly,第314页)(updadte:甚至Kochan的Objective-C第四版),在ARC的背景下,他们比如属性的默认属性是assign......但是Apple的文档说默认是strong.

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

因此,如果大多数时间,我们想要

@property (nonatomic, readwrite, strong) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)

然后我们就可以写了

@property (nonatomic) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)

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

And*_*sen 12

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

*strong是默认值,假设你让编译器为你合成一个实例变量,或者声明了一个没有显式所有权限定符的实例变量(在这种情况下,ivar __strong默认是默认的).否则,默认属性所有权类型与ivar声明中的所有者限定符匹配.因此,如果你明确声明了一个ivar __weak,然后在没有所有权限定符的情况下为它声明一个@property,那么合成属性将会很弱.这些都记录在Clang ARC文档中.