2011-11-02 21 views
17
  1. 如果我声明属性强,像这样:ARC是否具有强大属性所必需的self.iVar?

    @property (strong, nonatomic) UIView *iVar; 
    

    当我设置它,它,如果我做iVar = ...self.iVar = ...重要?看起来,与ARC,他们做同样的事情。

  2. 如果我只声明实例变量(不是@property),例如,BOOL selected,这是否意味着它的推断是__unsafe_unretained(因为没有财产指定它是强大的),或者我必须明确指定?

好像我可以回答ARC: How to release static variable?已经回答了上面我自己的问题,但我仍然对上述问题略显迷茫。

回答

20

从存储管理的角度来看,使用ivar = ...self.property = ...(注:有没有这样的东西作为self.ivar)是相同的。但是,使用ivar = ...不会调用setter,而self.property = ...会。这有3点重要的影响,在没有特定的顺序:

  1. 如果属性没有标记nonatomic,然后访问底层的伊娃不会采取锁,你会被打破原子的影响。
  2. 如果该属性被覆盖,无论是由您还是由一个子类覆盖,重写的setter将不会被调用。
  3. KVO通知将不会发送。

至于只声明伊娃,它具有与声明局部变量相同的内存管理语义。这被记录在section 4.4 of the Objective-C Automatic Reference Counting文档中,但基本上,如果它是一个对象,则它将被推断为__strong

+0

@kaka:不。不管ARC/MRR如何,简单的反例:分配大于单个单词的结构几乎肯定不是原子的。 –

相关问题