ARC的强大属性是否需要self.iVar?

时间:2011-11-02 20:32:33

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

  1. 如果我宣布一个强大的财产,就像这样:

    @property (strong, nonatomic) UIView *iVar;
    

    当我设置它时,如果我iVar = ...self.iVar = ...,这是否重要?似乎在ARC中,他们做同样的事情。

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

  3. 在回答ARC: How to release static variable?时似乎我可能已经回答了我自己的问题,但我仍然对上述问题感到有些困惑。

1 个答案:

答案 0 :(得分:20)

从内存管理的角度来看,使用ivar = ...self.property = ...(注意:没有这样的东西self.ivar)是相同的。但是,ivar = ...使用self.property = ...时不会调用setter。这有三个重要的后果,没有特别的顺序:

  1. 如果该属性未标记为nonatomic,则访问基础ivar将不会获取锁定,您将打破原子性影响。
  2. 如果由您或子类覆盖该属性,则不会调用被覆盖的setter。
  3. 不会发送KVO通知。
  4. 至于仅声明ivar,它具有与声明局部变量相同的内存管理语义。这在section 4.4 of the Objective-C Automatic Reference Counting文档中有记录,但基本上,如果它是一个对象,它将被推断为__strong