24/7 twenty-four seven

iOS/OS X application programing topics.

autoreleaseされたオブジェクトはいつ解放されるか

http://mtl.recruit.co.jp/blog/2009/01/iphoneiphonesdk.html

つまり、デフォルトでは、autoreleaseされたインスタンスは、このプールにどんどん、追加されてゆく。ちょっとした文字列であっても NSString.stringWithFormatを乱発すると、メモリ不足になりかねないということです。注意、注意。

http://mtl.recruit.co.jp/blog/2009/01/iphoneiphonesdk.html

NSAutoreleasePoolはイベントループが一周するたびに生成と破棄を繰り返します。
ですので、アプリケーション終了まで、オブジェクトが溜まっていくということはありません。
たいていは、autorelease済みのオブジェクトはメソッドを抜けた後に解放されます。


ひとつのメソッドで、一時オブジェクトを大量に生成する場合は、メソッドを抜けるまではイベントループに戻らない(=オブジェクトが解放されない)ので、ループ中に自分でNSAutoreleasePoolを作ったほうがいい場合があります。

for (id obj in objects) {
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
		
	NSString *str = [NSString stringWithFormat:@"%@", obj];
		
	[pool release];
}