autoreleaseは、オーナーシップのルールさえ守れば怖くない。
@implementation Hoge
- (id)createObject {
NSObject* obj = [[NSObject alloc] init]; // [obj retainCount] == 1
return obj;
}
@end
みたいにした場合、クラスメソッドでなくても、objのオーナーはHogeクラスであり、オーナーシップを放棄するなら、
@implementation Hoge
- (id)createObject {
NSObject* obj = [[NSObject alloc] init]; // [obj retainCount] == 1
return [obj autorelease];
}
@end
にしなければならない。
こうすることで、Hogeクラスはobjのオーナーであることを放棄し、呼び出し元でretainすると、そいつが新しいオーナーになる。
呼び出し元でretainしない場合は、何時かは分からないが、objが所属するNSAutoreleasePoolがreleaseされた時に、releaseされて解放される。
Objective-C/C++の仕様上、releaseされて参照カウンタが0になった瞬間に、deallocされてしまうのだが、それでは、
@implementation Hoge
- (id)createObject {
NSObject* obj = [[NSObject alloc] init]; // [obj retainCount] == 1
return [obj release];
// 育児放棄したいが、[obj retainCount] == 0になり、返る前に死ぬ
}
@end
というようには書けない。
遅延releaseを実現するのが、autoreleaseな訳ですな(´ω`)
2 件のコメント:
なぜObjective-C...と思ったら i ですか
そうなんですよー
ちょっと戸惑うこともありますが、
概ね書いてて楽しいです>Objective-C
コメントを投稿