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。
- @卡卡:不是。小反例:无论ARC/MRR如何,分配一个大于单个单词的结构几乎肯定不是原子的。