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、別のスレッドが同時にセッターを使用している場合でも、戻り値を使用しても安全です。
  • オブジェクトの所有権のセマンティクスは正しく処理されます。これはMRC(非ARC)で最も重要ですが、ARCでも、値copyに宣言されたプロパティをバックするivarに割り当てるときに忘れがちcopyです。
于 2013-03-12T12:00:22.920 に答える
1

アクセサーをオーバーライドしていなければ安全です。たとえば、代替動作を提供する場合-setImageView、直接呼び出すとivarその動作はスキップされます。一般的なデザイン ルールとして、ivar を直接使用するよりもアクセサー メソッドを使用する傾向があります。意図しない副作用が発生しにくく、アクセサーをオーバーライドする場合に継承がうまく機能します。

于 2013-03-12T11:55:27.643 に答える
0

それは一種の節約ですが、良い習慣ではありません。_imageViewは、setterおよびgetter自体とinitでのみ使用する必要があります。特に、後でクラスをサブクラス化したい場合。サブクラスは、getterメソッドとsetterメソッドを意図的に上書きする場合があります。その場合、_imageViewに期待するものが含まれていない可能性があります。self.imageViewを使用します。それはアクセサーを呼び出します

于 2013-03-12T12:01:42.327 に答える