ページ

2008-09-10

autorelease続き

勘違い。

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 件のコメント:

mokehehe さんのコメント...

なぜObjective-C...と思ったら i ですか

k-ya さんのコメント...

そうなんですよー
ちょっと戸惑うこともありますが、
概ね書いてて楽しいです>Objective-C