我最近搞砸了财产和伊娃。
一个非常简单的问题,但找不到答案。
我可以说实例变量很强且是原子的吗?
感谢〜
答案 0 :(得分:2)
对于包含对象引用的实例变量,可以使用__weak或__strong关键字。默认为__strong。如果您还使用实例变量声明属性,则需要同意该属性。
实例变量不能是原子的。原子不是实例变量的属性,它是用于访问它的代码的属性。因此,属性可以是原子的也可以是非原子的,但实例变量不能。注意,原子不是特别有用;这在别处讨论过。
实例变量也不能只读。如果您有一个实例变量,任何可以访问它的人都可以读取并写入它。另一方面,实例变量可以是@private,@ protected或@public,属性不能。
答案 1 :(得分:1)
提供更广泛的答案:
一个。所有权资格(强,弱,不安全未获得)
如前所述,(明确地)声明ivars 默认为强大的每个其他本地var。您可以使用__weak
或__unsafe_unretained
以常规方式更改此行为。
如果您有(隐式或显式)合成属性和否(显式)声明ivar ,则会合成ivar并继承其来自财产的所有权资格,具有默认的强大所有权。
如果您(明确地)声明了ivar 绑定到(隐式或显式)合成属性,则属性和ivar的所有权限定为同样的。
如果合成了一个属性,则关联的实例变量是实例变量,它可能由@synthesize声明隐式命名。如果关联的实例变量已存在,则其所有权限定必须等于属性的所有权;否则,将使用该所有权限定创建实例变量。
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations
B中。原子
原子性有两个影响:
第一个主题显然与控制流有关,而不是与所有权有关,所以它对ivar没有影响,你不能用原子性来限定ivar。
第二个主题意味着您可以想象返回值在MRR中获得另外两条消息:
return [[ivar retain] autorelease]
ARC尊重这一惯例。但是,使用ARC,其含义在通常的代码中是学术性的。
答案 2 :(得分:0)
默认情况下,对象的实例变量为strong
,除非您使用__weak
关键字,在这种情况下它很弱。
除非你在分配或访问它时安排使用线程锁定机制,否则它永远不会是原子的。
通常,在实例变量上使用属性会更方便。
答案 3 :(得分:-1)
属性可以是强大的和原子的,因为强和原子是默认的,你可以像这样指定它们:
@property id name;
默认情况下,实例变量很强,但由于它们没有访问器,因此您需要自行锁定。其中一个原因是使用属性而不是直接访问实例变量。