2010-03-30
■ [NSAutoReleasePool][CFRunLoop] NSAutoReleasePoolの管理者は誰であるべきか
![[NSAutoReleasePool][CFRunLoop] NSAutoReleasePoolの管理者は誰であるべきか - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント [NSAutoReleasePool][CFRunLoop] NSAutoReleasePoolの管理者は誰であるべきか - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント](http://r.hatena.ne.jp/images/popup.gif)
昨晩、スレッドを使いこなすために「NSAutoReleasePoolをどこで作るか」というのを調べていました。
プロジェクトを新規作成するとmain()内に以下のコードが記述されています。
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal;
これに対し、「なぜランループ内ではなく、main()に直接書いてあるのだろう?これだと記入漏れやうっかり削除もあり得るのでは?」と思ったわけです。
そこでTwitterで呟いたところ、投稿が物書堂さんとnorio_nomuraさん、cqa02303さんの目に留まり、色々とアドバイスをしてもらいました。
そのときの内容をとTogetterで纏めましたので、ここにリンクを貼っておきます。
NSAutoReleasePoolの作成&解放タイミングについて - Togetter
最後はnatsun_happyさん*1にも混じっていただいたおかげで、うまい具合にまとめることが出来ました。
皆様、ありがとうございました。
TLで出てきたTips
上記タイムラインで出てきたTipsをここにも記しておきます。
NSAutoReleasePoolの中味をログ出力させる
クラスメソッド[NSAutoReleasePool showPools]を使います。Unpublished Methodなのでビルド時に警告が出ますが問題はありません(Objective-Cはすごいですね)。
これにより以下の情報を確認できます。
- NSAutoReleasePoolが何層構造になっているか
- 各階層では何のクラスのオブジェクトが保持されているか
あまり詰まっているようだとメモリ活用として問題があると思いますので、参考にすると便利です。
NSAutoReleasePoolが作られていないときにautoreleaseされるオブジェクトがあるかどうかの識別方法
自分の作ったスレッドでプールがきちんと使われているか心配になったときは、ログに
…autoreleased with no pool in place - just leaking
と出力されていないかをチェックしてみてください。もしプールを用意していなければ、autoreleaseしたタイミングで上の文字列が問題のクラス名と共に出力されます。
通常は設計の時点でこんな不具合は潰されているべきですけれど・・・。
■ MetronomePROに関するお詫び

最後に、お詫びです。
拙作のメトロノームアプリ「MetronomePRO(iTunesが開きます)」ですが、現行の1.3で見られる幾つかの不具合を修正した1.3.1のレビューがなかなか終わりません。現在5日目に突入です。
アップルがiPadのアプリ審査に注力しているせいかなとも思いますが、ユーザーの皆様、どうぞもう少しだけ修正版のリリースをお待ちください。
ご迷惑をおかけいたします。
*1:CoreData周りにとてもお詳しい方です。