11

私はほとんどの部分でプロパティを理解していると思います。私の質問は、インスタンス変数のプロパティがあり、実装ファイルのメソッド内からそれを設定または取得している場合、使用する必要がありますself.myPropertyか、それとも単にmyPropertyですか?どちらかが機能することは知っていますが、規則が混在していることもあります。コードが変数に直接アクセスする場合と、プロパティを介してアクセスする場合があります。

これを行う技術的な理由はありますか?それは単なる慣習/個人的な好みですか?また、メソッドのパラメーター名がインスタンス変数名と衝突するインスタンスについては言及していません。これは、プロパティを使用する理由の1つである可能性があります(少なくとも、他の言語では、これについてはわかりません)。実装内でプロパティを使用する場合、プロパティを宣言した方法(つまり、非アトミック、retain)を利用したいと思うので、たとえばメソッドでは、次のことができます。

self.myProperty = [someObject someAutoReleasedObject];

それ以外の:

myProperty = [[someObject someAutoReleasedObject] retain];

これが理由ですか?それで、プロパティを使用するのが良いと思われる特定の状況だけがありますか?

私はObjective-Cを初めて使用しますが、これは私が混乱している数少ないことの1つです。これまでのところ、インスタンス変数に直接アクセスしましたが、プロパティを通過すると実際にメソッド/メッセージが呼び出されて送信され、不要なオーバーヘッドが追加されるという誤った仮定があります。私はこれが間違っていると確信していますが、オーバーヘッドの違いがごくわずかであっても(あるとしても)、変数に直接アクセスできるのに、なぜそれを追加することを選択するのでしょうか?

私は自分の考えが間違っていると確信しているので、ここで質問しています。

4

2 に答える 2

5

まず、Apple のドキュメントによると (正当な理由により)、init または dealloc で setter または getter を使用しないでください。

それ以外は、一般的に、変数がある場合は、変数を設定するためにセッターを使用する必要があります。

通常、実装内から ivar にアクセスするために getter をわざわざ使用することはありませんが、必要な場合があります。特に、ゲッターが何らかの計算またはチェックを行うと予想される場合、またはサブクラスが動作をオーバーライドできるようにする場合。

確かに、実装で getter を使用する方がより一般的で安全ですが、通常は無意味で無駄が多くなります。あなたの選択をしてください。

セッターを使用することは、他のコードが変更を監視するための操作 (キー値の監視) を提供するだけでなく、サブクラスがセッターをオーバーライドして必要なその他の調整を行う機会を与えるため、重要です。

ただし、ivar とプロパティに別の名前を使用することを強くお勧めします。通常の規則ではアンダースコア プレフィックス ( _) を使用i_しますが、Apple の私的な使用法との混同を避けるために個人的にプレフィックスとして使用しています。そうすれば、誤って間違ったものを使用することはありません:

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
于 2009-06-27T03:05:31.667 に答える
0

プロパティを外部に公開していて、内部で使用している場合は、コード全体でプロパティを使用する必要があります。その理由はカプセル化です。SomeObjの「Id」プロパティがあるとします。ある時点で、Idの動作を置き換えることにしたとします(おそらく、Idをクラスのメンバー変数として開始し、進化することで、データベースから取得されるデータの一部になります)。次に、クラスの実装を実行し、メンバーvarへのすべての参照をデータベース呼び出しに置き換える必要があります。self.Idがある場合は、ゲッターをオーバーライドする必要があります。

于 2009-06-26T22:39:18.037 に答える