关于C#:对于ARC的强大属性,self.iVar是否必要?

Is self.iVar necessary for strong properties with ARC?

  • 如果我声明一个强属性,就像这样:

    1
    @property (strong, nonatomic) UIView *iVar;

    当我设置它时,我是执行iVar = ...还是执行self.iVar = ...有关系?似乎用弧线,他们也做同样的事情。

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

  • 似乎我在回答ARC时回答了我自己的问题:如何释放静态变量?但在上述问题上我还是有点困惑。


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

  • 如果属性没有标记为nonatomic,那么对底层ivar的访问将不会获得锁,您将破坏原子性的影响。
  • 如果属性被您或子类重写,则不会调用被重写的setter。
  • 不会发送kvo通知。
  • 对于只声明IVAR,它具有与声明局部变量相同的内存管理语义。这在目标C自动参考计数文件的第4.4节中有记录,但基本上,如果它是一个对象,它将被推断为__strong