番号1は、MyOtherObjectクラスを前方宣言して、コンパイラとリンカに表示されるコードの量を最小限に抑え、循環参照を回避する可能性があるという点で、他の2つとは異なります。この方法で行う場合は、#importを.mファイルに入れることを忘れないでください。
@property(および.m内の@synthesizeと一致する)ファイルを宣言することにより、指定した方法で処理されたメモリセマンティクスを使用してアクセサメソッドを自動生成します。ほとんどのオブジェクトの経験則は保持ですが、たとえばNSStringsはコピーを使用する必要があります。シングルトンとデリゲートは通常、割り当てを使用する必要があります。手書きのアクセサーは面倒でエラーが発生しやすいので、これにより多くの入力やばかげたバグを節約できます。
また、合成プロパティを宣言すると、次のようなドット表記を使用してアクセサメソッドを呼び出すことができます。
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
通常のメッセージパッシング方法の代わりに:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
舞台裏では、実際には次のようなメソッドを呼び出しています。
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
…またはこれ
- (MyOtherObject *) otherObject {
return otherObject;
}
お尻の全体的な痛み、右。次に、クラス内のすべてのivarに対してこれを実行します。正確に行わないと、メモリリークが発生します。コンパイラに作業を任せるのが最善です。
私はそれを参照番号1は、 IVARを持っていません。これがタイプミスではないと仮定すると、@ property / @synthesizeディレクティブがバックグラウンドでivarを宣言するので、問題ありません。これはMacOSXの新機能だと思います-SnowLeopardとiOS4。
3番にはこれらのアクセサーが生成されていないため、自分で作成する必要があります。アクセサメソッドに副作用を持たせたい場合は、上記のように標準のメモリ管理ダンスを実行してから、アクセサメソッド内で必要な副次的な作業を実行します。プロパティを合成するだけでなく、独自のプロパティを作成する場合は、バージョンが優先されます。
私はすべてをカバーしましたか?