繁体   English   中英

Objective-C使用合成值

[英]Objective-C using the synthesized value

假设我创建了一个自定义的UIView子类,它有一个名为imageView的属性。 我已经合成了imageView ,如下所示:

@synthesize imageView = _imageView;

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

不,直接进入伊塔尔是不安全的。 只是为了说清楚:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM