NSAutoReleasePoolの作成&解放タイミングについて

XcodeでCocoa/Cocoa touchプロジェクトを新規作成したときに、main関数でNSAutoReleasePoolを生成してからランループを開始しています。「それならランループ内部でNSAutoReleasePoolの作成&解放を行ってしまえば良いじゃない」と思って呟いたときの、先達からのアドバイスです。
11
Hirohito Kato ⌘ @hkato193

@norio_nomura はい、試してみたのですが普段と変わりはありませんでした。確認出来る範囲ではshowPoolsの階層が1つ減っただけで、特に動作の問題は無しです。終了時も然り(もともとmainまで戻らないですが)。

2010-03-29 22:43:29
Hirohito Kato ⌘ @hkato193

main()が呼ばれたすぐ後にautoreleaseされるオブジェクトを作ってみたけれど、特に落ちたりはしなかった。もちろん、その後で作るプールにも登録されていない。ふむふむ。

2010-03-29 22:39:43
物書堂(ものかきどう) @monokakido

@hkato193 コンソールにログが出ませんでしたか?

2010-03-29 22:41:12
Hirohito Kato ⌘ @hkato193

@monokakido あ、出ていました。autoreleaseしたタイミングで「…autoreleased with no pool in place - just leaking」と出ました。ご指摘ありがとうございます。

2010-03-29 22:49:47
Hirohito Kato ⌘ @hkato193

ということは、スレッド作るときにAutoReleasePoolを作っているかどうかはランタイムでも確認できるということか(いや、設計の段階でそんなポカはしないですが)。

2010-03-29 22:51:40
Hirohito Kato ⌘ @hkato193

@hkato193 設計の段階で潰されている問題なので、そんなポカはしない、と書こうとしました。

2010-03-29 22:52:34
Norio Nomura @norio_nomura

@hkato193 なるほど、ありがとうございます。 UIApplicationMain は行儀よくつくられてるのですね。

2010-03-29 22:47:07
Hirohito Kato ⌘ @hkato193

@norio_nomura こちらこそ、お馬鹿な呟きから付き合っていただいたので恐縮しています。ありがとうございます。

2010-03-29 22:54:32
Hirohito Kato ⌘ @hkato193

CoreFoundationのソースコードがOpenSourceのページに見つからないなど。少なくとも書籍Dynamic ObjC出版時とは様相が違う。 http://www.apple.com/opensource/

2010-03-29 23:20:07
物書堂(ものかきどう) @monokakido

@hkato193 pthread_getspecific(__CFTSDKeyRunLoop) で取得できなければ作ってpthread_setspecificしてますね。

2010-03-29 23:28:40
Hirohito Kato ⌘ @hkato193

@monokakido ありがとうございます。ちょうどその場所を読んでいました。staticな__CFRunLoopsディクショナリにも入れつつ、各スレッドの固有データ領域に突っ込んでいますね。

2010-03-29 23:36:37
Natsuko Nishikata @natsun_happy

@hkato193 横から失礼します。arrayWithObjectなどの生成メソッド(alloc, initなしでオブジェクトを生成)をいつでも使えるようにするためには、ApplicationMainの前でプールを作るのは妥当だと思うのですが。と、論点ずれていたらすみません!

2010-03-29 22:52:45
Hirohito Kato ⌘ @hkato193

@natsun_happy ご指摘ありがとうございます。今得た知識を総動員させてください。えっと、アプリケーションのRunLoopを使わない環境ではプール作成は仰るとおり絶対必要だと思います。ただ、mainがプール作成する必要が本当にあるのかなと疑問に思ったのが発端なのです。

2010-03-29 23:04:56
Hirohito Kato ⌘ @hkato193

@natsun_happy プールの提供方針として、XXApplicationMain関数の最初と最後でプール作成&解放したり、スレッドであれば指定処理の前後にコッソリとプール処理を入れておくのもあり得ると思います。しかし、実際にはそうしていない。何故かなあ、と。

2010-03-29 23:07:47
Natsuko Nishikata @natsun_happy

@hkato193 なるほど、思ったより奥が深かったです。失礼いたしました。みなさまのツイートざっと追って、なんとなく理解しました。

2010-03-29 23:20:39
Hirohito Kato ⌘ @hkato193

@natsun_happy いいえ、私も大幅に誤解していたので他の皆さんに恐縮するばかりです。

2010-03-29 23:23:23
Hirohito Kato ⌘ @hkato193

CoreFoundationって面白いなり。いやしかし、NSThreadを使うための調査が、どうしてこうなった感がそこはかとなくありますですよ。皆さん、ありがとうございます。

2010-03-29 23:49:31