2

プロパティの値を読み取るために(get)アクセサーを使用することと、iVarを直接使用することの違いは正確には何でしょうか?

プロパティを宣言するクラスがあるとします。

@interface Foo : NSObject

@property (strong) NSString *someString;

@end

そして、実装では私はそれを使用しています。次の2行に違いはありますか?

someLabel.text = self.someString;

someLabel.text = _someString;

セットアクセサーの場合、それは明らかです。強力なプロパティのAfaikは、アクセサが保持と解放を処理します(興味深い「副次的な質問」は、ARCがそれを変更するかどうか、つまり、iVarを直接設定するか[__weak iVarではないと仮定して]ARCを使用して正しく保持および解放するかどうかです)、 KVOでは、正しく機能するためにアクセサーを使用する必要があります。しかし、ゲッターはどうでしょうか。

そして、違いがない場合、ベストプラクティスと見なされる1つの方法はありますか?

どうも

4

3 に答える 3

4

ご存知のように、電話self.someStringは本当に[self someString]です。プロパティを作成することを選択した場合は、そのプロパティを使用する必要があります。プロパティに他のセマンティクスが追加されている可能性があります。おそらく、プロパティは遅延ロードされています。おそらく、プロパティはivarを使用していません。おそらく、プロパティのゲッターを呼び出すことには、他に必要な副作用があります。今はないかもしれませんが、将来的には変わるかもしれません。プロパティを呼び出すと、コードがもう少し将来にわたって利用できるようになります。

ivarとプロパティがある場合は、代わりにivarを使用する明確な理由がない限り、プロパティを使用してください。プロパティの余分なセマンティクスや副作用を実行したくない場合があります。したがって、このような場合は、ivarを直接使用する方が適切です。

しかし、最終的には、それはあなたのコード、あなたの財産、あなたのivarです。プロパティを追加した理由をご存知でしょう。もしあれば、あなたはそのプロパティの潜在的な利点を知っています。

于 2012-10-24T22:40:15.143 に答える
2

これがあなたが探しているものだと思います。なぜゲッターとセッターを使用するのですか?

クラスのフィールドを直接公開するのではなく、アクセサを使用することを検討する理由は実際にはたくさんあります。カプセル化の議論だけでなく、将来の変更を容易にすることもできます。

これが私が知っている理由のいくつかです:

  • プロパティの取得または設定に関連する動作のカプセル化-これにより、追加機能(検証など)を後で簡単に追加できます。
  • 代替表現を使用してプロパティを公開している間、プロパティの内部表現を非表示にします。
  • パブリックインターフェイスを変更から保護する-既存のコンシューマーに影響を与えることなく、実装が変更されている間もパブリックインターフェイスを一定に保つことができます。
  • プロパティの有効期間とメモリ管理(廃棄)セマンティクスの制御-管理されていないメモリ環境(C ++やObjective-Cなど)では特に重要です。
  • 実行時にプロパティが変更されたときのデバッグインターセプトポイントを提供します。一部の言語では、これがないと、プロパティが特定の値に変更されたときと場所のデバッグが非常に困難になる可能性があります。
  • プロパティゲッター/セッターに対して動作するように設計されたライブラリとの相互運用性の向上-モッキング、シリアル化、およびWPFが思い浮かびます。
  • getter / setterメソッドをオーバーライドすることにより、継承者がプロパティの動作と公開のセマンティクスを変更できるようにします。
  • ゲッター/セッターを値ではなくラムダ式として渡すことができます。
  • ゲッターとセッターは、異なるアクセスレベルを許可できます。たとえば、getはパブリックである可能性がありますが、セットは保護されている可能性があります。
于 2012-10-24T22:48:57.743 に答える
1

私は、約10年前のソースコードを見て自分の意見や経験を伝えようとしていますが、この質問に答えるのはあまり経験豊富な人ではありません。

以前のコードでは、彼らはivarsとproperty/synthesiseを作成していました。現在、プロパティ/合成のみが使用されています。私が見る利点の1つは、コードが少なく、混乱がないことです。

錯乱!!!はい、ivarsとそのプロパティの名前が異なると、他の人や、しばらくして自分のコードを読んでいる場合でも、混乱を招きます。したがって、ivarとpropertyには1つの名前を使用します。

プロパティKVO/KVB / KVCを使用することにより、自動的に処理されます。

@ property / @ Synthesiseは、ivarを0/nilなどに設定します。

サブクラスに同じivarが含まれている場合にも役立ちます。

可変オブジェクトの場合プロパティを作成しないでください。

于 2012-10-25T05:56:22.837 に答える