众所周知,在ARC规则下,默认值为strong
,因此可以使用
@property NSString *downloadPath
但为什么
@property (readonly) CGFloat progress
@property (readonly) BOOL isSSL
好吗?由于它们是基本类型,因此应使用assign
。我可以理解ARC规则如下:
当属性是基本类型时,默认值为assign
,当属性是对象类型时,默认值为strong
?
答案 0 :(得分:1)
atomic
。
答案 1 :(得分:1)
从所有权推断的clang documentation开始:
如果使用可保留对象所有者类型声明对象,但没有显式所有权限定符,则会隐式调整其类型以具有__strong限定条件。
可以在same page上找到原因:
默认情况下使用strong是安全的,并且与关于推断所有权的通用ARC规则一致。遗憾的是,它与非ARC规则不一致,该规则声明这些属性是隐式赋值的。但是,这个规则在ARC中显然是站不住脚的,因为它会导致默认不安全的代码。
正如文档所述,默认所有权限定符为assign
,但对于可保留类型(也称为对象),默认限定符更改为strong
,这有助于开发人员编写安全代码。
答案 2 :(得分:0)
默认值是什么?
基本类型 - 基本类型和struct
类型 - 分配堆栈,并在赋值时复制它们的值。对于此类型strong
,weak
,unsafe_unretained
和copy
都没有意义 - 没有引用堆对象,并且始终会复制值。
所以这些都不是默认的。
哪一个留下assign
(和文档一致)。相信你的直觉!
HTH