2012年10月20日土曜日

NSAutoreleasePoolの書き方三種類。

Objective-Cにはよくあることだけど、やり方が複数あってどれが正しいのか困る。

[NSAutoreleasePool release];

昔のやり方ではこう。

autolereaseメッセージが呼ばれたオブジェクトに、releaseが呼ばれる。

[NSAutoreleasePool drain];

ガベージコレクタとともに追加。

GC環境下ではGC実行開始の要求、MRC環境下では上述のreleaseと同じ効果。

GC環境でのコードとMRC環境のコードが混在する場合のために存在する。一般的にはreleaseではなくdrainを使用するべき、とある。

@autoreleasepoolブロック

ARCでNSAutoreleasePoolの直接使用が禁止になるとともに追加。上述のreleaseと同じ効果を持つ(ドキュメントを見る限りdrainと等価ではない?…んだけど、そもそもARCとGCが混在する環境の話なんざ気にしなくてよさそう)

MRCでも@autoreleasepoolの方が効率が良いために推奨されている。

つまり全て@autoreleaseでOK。

余談

NSAutoreleasePoolでは、initされてからrelease/drainが呼ばれるまでの間に制御が別の場所に移る(つまりrelease/drainが呼ばれないまま放置される)と、そのプールでのオブジェクトがリークする恐れがあったが、@autoreleaseではブロックを抜ける際に必ず遅延releaseが実行されることが保証される。

0 件のコメント:

コメントを投稿