Objective-C使用合成值

时间:2013-03-12 11:48:12

标签: objective-c

假设我创建了一个自定义UIView子类,其子类名为imageView。 我已将imageView合成如下:

@synthesize imageView = _imageView;

在我的所有自定义类方法中使用_imageView而不是self.imageView是否安全?

3 个答案:

答案 0 :(得分:3)

不,直接访问ivar不是安全。只是说清楚:

  1. _imageViewself->_imageView的缩写:直接进行ivar访问。
  2. self.imageView[self imageView]的缩写:使用访问者方法。
  3. 在类实现中使用访问器具有以下优点:

    • 不会绕过覆盖属性访问器的子类。
    • KVO合规性保持不变。
    • 对于atomic属性,即使另一个线程同时使用setter,也可以安全地使用返回的值。
    • 正确处理对象所有权语义。这在MRC(非ARC)下最重要,但即使在ARC下,当分配给那些声明为copy其值的属性的ivars时,仍然很容易忘记copy

答案 1 :(得分:1)

假设您没有覆盖访问者,这是安全的。例如,如果您为-setImageView提供备用行为,则直接调用ivar将跳过该行为。作为一般设计规则,我倾向于直接使用访问器方法而不是ivar。在您覆盖访问者的情况下,它不太容易出现意外的副作用,并且在继承方面表现得更好。

答案 2 :(得分:0)

这是一种保存但不是很好的做法。你应该只在setter中使用_imageView,在init中使用getter本身。特别是当你以后想要继承你的课时。子类可能会故意覆盖getter和setter方法。在这种情况下,_imageView可能不包含您的期望。使用self.imageView。这将调用访问者