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

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

スレッド作成時にAutoReleasePoolを作るけれど、例えばランループを作る場合は意味があるんだろうか?スレッドが死ぬまで解放されなさそうなんだけれど…。

2010-03-29 21:20:43
Hirohito Kato ⌘ @hkato193

@hkato193 何を言っているんですか。ランループの外ではなくて中でAutoReleasePoolの生成→解放(or drain)をしているじゃないですか。

2010-03-29 21:27:54
Norio Nomura @norio_nomura

@hkato193 ループの先頭で作って、末尾で開放すれば良いだけでは?

2010-03-29 21:23:04
Hiroyuki-Fujikawa.OXP @cqa02303

@hkato193 モザイクが出来にくいって利点が有ると思ってるんだけど。

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

@hkato193 RunLoopはスレッドを作ると自動的に作られるもので、明示的に作るものではないと思います。

2010-03-29 21:24:20
Hirohito Kato ⌘ @hkato193

@norio_nomura @monokakido はい。書いてからリンゴを剥いていたときに気づきました。問題は2点:1.プールの生成タイミングが違う 2.ランループという言葉はCocoaアプリ用語で存在している。失礼しました。

2010-03-29 21:31:07
Hirohito Kato ⌘ @hkato193

@cqa02303 モザイク、ですか。メモリフラグメンテーションのような意味で考えてもOKですか?

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

失態の後ですが敢えて続きの疑問を書きます。そうなると、なぜNSRunLoopでAutoReleasePoolを作れば良いのに、ユーザーに(あるいはテンプレートで)XXApplicationMainの前後でプールを作らせているのかなあ??モザイク防止?

2010-03-29 21:38:51
Norio Nomura @norio_nomura

@hkato193 RunLoop が thread に作られても、駆動するコードを組まないと動かないからですよ。駆動する前後に AutoreleasePool を必要とするコードを書く可能性があるからです。

2010-03-29 21:42:49
Hiroyuki-Fujikawa.OXP @cqa02303

ObjCのpoolの裏でやってる事を想像するだけで怖い。賢い人の作るプログラムは違うわー

2010-03-29 21:44:15
Hirohito Kato ⌘ @hkato193

@norio_nomura わわ、たびたびすみません。ということは、main.mに書かれるXXApplicationMainの前後のプール生成&解放処理は、ユーザーへの注意喚起の意味合いが強いと考えました。プールはネストして作られていますし。

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

クラスメソッド[NSAutoreleasePool showPools];で、コンソールにプールの各階層に入ったオブジェクトが確認出来る。

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

@hkato193 CFRunLoopが基本だからじゃないですかね?基本を学ぶには下のレイヤーで動いてるCoreFoundationが一番ですよ。

2010-03-29 22:05:00
Hirohito Kato ⌘ @hkato193

@monokakido @norio_nomura @cqa02303 ありがとうございます。CoreFoundationに足を突っ込んでみます。

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

@hkato193 CFRunLoopはスレッドごとに必ず存在するけど、そのWrapperであるNSRunLoopは呼ばれるまで作られないみたいです。CFRunLoop≠NSRunLoopです。

2010-03-29 22:10:02
Hirohito Kato ⌘ @hkato193

@monokakido 「CFRunLoopがスレッド毎に必ず存在する」という点が気になりpthreadで作ったスレッドに対してCFRunLoopGetCurrent()を呼んだところ、何物か分かりませんがアドレスが返ってきました。これも踏まえて更に調べてみます。

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

@hkato193 CFRunLoopGetCurrentを呼んだことで作られたのだと思います。必ずではないですね。「必要に応じて自動的に作られる」です。

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

@monokakido ありがとうございます。「CFRunLoopは必要に応じて作られる」ですね、しっかと覚えておきます。

2010-03-29 22:57:20
Norio Nomura @norio_nomura

@hkato193 QT: この辺りを読むと良いかと - iPhone Dev Center: Threading Programming Guide: Run Loops http://bit.ly/avNd1S /via @norio_nomura

2010-03-29 22:16:30
Norio Nomura @norio_nomura

@hkato193 main.m でも、必要だから作ってるんじゃ無いのかな?試した事ないけど。 UIApplicationMain の中で RunLoop が駆動されるまでに、AutoreleasePool が必要なコードが使われてるかもしれないし。

2010-03-29 22:13:04
Hirohito Kato ⌘ @hkato193

@norio_nomura 試しに適当なiPhoneAppプロジェクトを作ってmain.mで作っている階層のプールをshowPoolsでチェックしたのですが、オブジェクトは1つも登録されていませんでした。ただ、その可能性は考えられますね。

2010-03-29 22:36:31
Norio Nomura @norio_nomura

@hkato193 main.m で AutoreleasePool を作らない様にして試して見たら?

2010-03-29 22:38:55