13

私はObjCアクセサーと合成アクセサーに関する多くの質問を検索しましたが無駄でした。この質問は、「問題の解決に役立つ」質問です。私は1つの答えを期待していませんが、私はむしろ議論を検討する専門家を探しています。

Cocoa Touchクラスでは、次のようなコードを記述します(ここsoundEffectsで、は合成されたNSArrayプロパティです)。

id foo = [self.soundEffects objectAtIndex:1];

同僚から、上記がこの行よりも優れている理由を説明するように求められました。

id foo = [soundEffects objectAtIndex:1];

まあ、機能的には、それは違いはありません。

前者に対する私の議論は次のとおりです。

  1. self.soundEffectsコードで作業している他のすべてのコーダーに、これはローカルスコープの変数ではなくiVarであることを通知します。

  2. soundEffects必要に応じて、ゲッターアクセサーにカスタムロジックを配置できます。

  3. 具体的な理由はありませんが、Obj-Cで1年間働いた後、それは正しいことのように「感じ」ます。

彼は引数#1と#2を有効なものとして受け入れますが、対位法も与えます。

  1. これは単なるコード膨張ではありませんか?

  2. クラスは、それ自体でメソッド(ゲッター)を呼び出さなくても、独自のiVarと直接通信することを許可されるべきではありませんか?

テイカーはいますか?

4

4 に答える 4

9

私は個人的にivarsにアンダースコアプレフィックスを使用することに決めました、そしてこの種の合成

@synthesize name = _name;

そうすれば私はそれらを混同しません。自己を使用しないことの主な問題は、このコードが

_name = ...

とは大きく異なります

self.name = ...

@propertyがretainオプションを使用する場合。1つ目はオブジェクトを保持せず、2つ目は保持する合成セッターを呼び出します。

それが大きな違いを生むのはアサインメントだけなので、私はいつも使う傾向があるので、アサインメントでそれself.を行うようにします。

于 2010-08-16T14:51:23.797 に答える
5

あなたのポイント1は完全に正しくself.soundEffectsありません:それあなたに何かを与えるかもしれませんが、あなたの合成の場合のようにNSArray現時点では、ivarではありません。

これは、ポイント2が問題の核心であることを意味します。すべてのアクセスをアクセサー経由でルーティングすると、すべてが適切にカプセル化され、副作用を心配することなく、後で実装を自由に変更できます。

ミューテーターを使用する場合にも、一貫したメモリ管理を維持するための良い方法です。

ほとんどの場合、プロパティであるself.propertyすべてのものを経由してルーティングし、厳密に内部にあるものへの直接のivarアクセス​​を制限することをお勧めします。ただし、場合によっては(特に/セマンティクスを使用しないものの場合)、スタイル設定になり得ることを認めます。retaincopy

于 2010-08-16T14:52:19.740 に答える
4

のようなものを使用self.variable = nilすると、変数がセッターを通過するため、メモリが無料で管理されます。variable = nilたとえば、deallocメソッドで使用する場合、実際には変数の合成セッターを通過せず、保持カウントが減少するため、リークが発生します。自己によるこのポストメモリリークを参照してください。

このため、常に自己を使用することをお勧めします(私は信じています)。メモリ管理に関する限り、所有しているインスタンス変数を処理する場合。

于 2010-08-16T14:47:26.373 に答える
1

self.soundEffects
setter / getterを介してインスタンス変数を設定/取得します。したがって、値が変更されたときにカスタム操作を実行する場合は、そのロジックをgetter/setterに入れることができます。

また、ios 6に従って、ivarはに対応します

@property(nonatomic)NSArray * propertyName;

になります

_プロパティ名

だから私はあなたが使うことができないと思います

id foo = [soundEffects objectAtIndex:1];
もうわかりませんが、代わりに使用する必要があります
id foo = soundEffects [1];

于 2013-05-17T06:17:42.110 に答える