いくつかの情報源 (stackoverflow.com、cocoa-dev、ドキュメント、ブログなど) から、init メソッドと dealloc メソッドでアクセサーと設定 (foo、setFoo:) を使用するのは「間違っている」と聞いています。そうすることで、プロパティを監視している他のオブジェクトを混乱させる可能性がわずかにあることを理解しています。(簡単な例をここに示します)
ただし、次の理由により、この慣行には同意しないと言わざるを得ません。
新しい Objective-C ランタイム (iPhone のランタイムと 10.5 の 64 ビット ランタイム) では、対応する ivar を宣言せずにプロパティを宣言できます。たとえば、次のクラスは 10.5 または iPhone (シミュレータではなくデバイス) で問題なくコンパイルされます。
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
上記が完全に有効な Objective-C クラスであることを理解した上で、イニシャライザとメモリ管理の目的で dealloc メソッドを作成するとします (iPhone では GC を使用できないため)。イニシャライザと解放についてこれまでに読んだことはすべて、次の 2 つのメソッドを作成することにつながります。
- (id) init {
if (self = [super init]) {
//initialize the value of someObject to nil
[self setSomeObject:nil];
}
return self;
}
- (void) dealloc {
//setting someObject to nil will release the previous value
[self setSomeObject:nil];
[super dealloc];
}
ただし、ドキュメントと一般的な意見によると、これは「間違っています」。だから私の質問はこれです:
- アクセサーを使用せずに someObject を初期化するにはどうすればよいですか? コンパイラ (またはランタイムなど) が someObject が既に nil に設定されていることを保証すると言うかもしれませんが、それに依存するのは不適切な動作だと思います。C のバックグラウンドがかなりあるので、変数を適切に初期化していないためにかなりの数のバグを見てきましたが、これはほとんど変わらないようです。
- dealloc メソッドでアクセサーを使用することになっていない場合、someObject を解放するにはどうすればよいですか?
これらのいずれかに対する答えが「できない」である場合、init および dealloc メソッドでアクセサーを使用することがどうして悪いのでしょうか?