1

假设我创建了一个自定义UIView子类,它有一个名为imageView. 我合成imageView如下:

@synthesize imageView = _imageView;

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

4

3 回答 3

3

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

  1. _imageView简称self->_imageView:直接 ivar 访问。
  2. self.imageView缩写[self imageView]:使用访问器方法。

在类实现中使用访问器具有以下优点:

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

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

于 2013-03-12T11:55:27.643 回答
0

It is sort of save but not good practice. You should use _imageView only in the setter and getter itself andn in init. Especially when you may whant to subclass your class later. The subclass may intentionally overwrite the getter and setter methods. In that case _imageView may not contain what you expect. Use self.imageView. That will invoke the accessors

于 2013-03-12T12:01:42.327 回答