使用ARC的@property定义:strong是默认值,但基本类型的默认值是什么?

时间:2016-01-20 13:57:37

标签: ios objective-c automatic-ref-counting

众所周知,在ARC规则下,默认值为strong,因此可以使用

@property NSString *downloadPath

但为什么

@property (readonly) CGFloat progress
@property (readonly) BOOL isSSL 

好吗?由于它们是基本类型,因此应使用assign。我可以理解ARC规则如下:

当属性是基本类型时,默认值为assign,当属性是对象类型时,默认值为strong

3 个答案:

答案 0 :(得分:1)

你是对的!另一个默认属性是atomic

答案 1 :(得分:1)

从所有权推断的clang documentation开始:

  

如果使用可保留对象所有者类型声明对象,但没有显式所有权限定符,则会隐式调整其类型以具有__strong限定条件。

可以在same page上找到原因:

  

默认情况下使用strong是安全的,并且与关于推断所有权的通用ARC规则一致。遗憾的是,它与非ARC规则不一致,该规则声明这些属性是隐式赋值的。但是,这个规则在ARC中显然是站不住脚的,因为它会导致默认不安全的代码。

正如文档所述,默认所有权限定符为assign,但对于可保留类型(也称为对象),默认限定符更改为strong,这有助于开发人员编写安全代码。

答案 2 :(得分:0)

默认值是什么?

基本类型 - 基本类型和struct类型 - 分配堆栈,并在赋值时复制它们的值。对于此类型strongweakunsafe_unretainedcopy都没有意义 - 没有引用堆对象,并且始终会复制值。

所以这些都不是默认的。

哪一个留下assign(和文档一致)。相信你的直觉!

HTH