ios实例变量的特征

时间:2015-05-07 08:19:06

标签: ios objective-c

我最近搞砸了财产和伊娃。

一个非常简单的问题,但找不到答案。

我可以说实例变量很强且是原子的吗?

感谢〜

4 个答案:

答案 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;

默认情况下,实例变量很强,但由于它们没有访问器,因此您需要自行锁定。其中一个原因是使用属性而不是直接访问实例变量。