假设我创建了一个自定义UIView
子类,其子类名为imageView
。
我已将imageView
合成如下:
@synthesize imageView = _imageView;
在我的所有自定义类方法中使用_imageView
而不是self.imageView
是否安全?
答案 0 :(得分:3)
不,直接访问ivar不是安全。只是说清楚:
_imageView
是self->_imageView
的缩写:直接进行ivar访问。self.imageView
是[self imageView]
的缩写:使用访问者方法。在类实现中使用访问器具有以下优点:
atomic
属性,即使另一个线程同时使用setter,也可以安全地使用返回的值。copy
其值的属性的ivars时,仍然很容易忘记copy
。答案 1 :(得分:1)
假设您没有覆盖访问者,这是安全的。例如,如果您为-setImageView
提供备用行为,则直接调用ivar
将跳过该行为。作为一般设计规则,我倾向于直接使用访问器方法而不是ivar。在您覆盖访问者的情况下,它不太容易出现意外的副作用,并且在继承方面表现得更好。
答案 2 :(得分:0)
这是一种保存但不是很好的做法。你应该只在setter中使用_imageView,在init中使用getter本身。特别是当你以后想要继承你的课时。子类可能会故意覆盖getter和setter方法。在这种情况下,_imageView可能不包含您的期望。使用self.imageView。这将调用访问者