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