NSAutoReleasePoolの作成&解放タイミングについて
スレッド作成時にAutoReleasePoolを作るけれど、例えばランループを作る場合は意味があるんだろうか?スレッドが死ぬまで解放されなさそうなんだけれど…。
2010-03-29 21:20:43@hkato193 何を言っているんですか。ランループの外ではなくて中でAutoReleasePoolの生成→解放(or drain)をしているじゃないですか。
2010-03-29 21:27:54@hkato193 RunLoopはスレッドを作ると自動的に作られるもので、明示的に作るものではないと思います。
2010-03-29 21:24:20@norio_nomura @monokakido はい。書いてからリンゴを剥いていたときに気づきました。問題は2点:1.プールの生成タイミングが違う 2.ランループという言葉はCocoaアプリ用語で存在している。失礼しました。
2010-03-29 21:31:07失態の後ですが敢えて続きの疑問を書きます。そうなると、なぜNSRunLoopでAutoReleasePoolを作れば良いのに、ユーザーに(あるいはテンプレートで)XXApplicationMainの前後でプールを作らせているのかなあ??モザイク防止?
2010-03-29 21:38:51@hkato193 RunLoop が thread に作られても、駆動するコードを組まないと動かないからですよ。駆動する前後に AutoreleasePool を必要とするコードを書く可能性があるからです。
2010-03-29 21:42:49@norio_nomura わわ、たびたびすみません。ということは、main.mに書かれるXXApplicationMainの前後のプール生成&解放処理は、ユーザーへの注意喚起の意味合いが強いと考えました。プールはネストして作られていますし。
2010-03-29 22:03:57クラスメソッド[NSAutoreleasePool showPools];で、コンソールにプールの各階層に入ったオブジェクトが確認出来る。
2010-03-29 22:08:58@hkato193 CFRunLoopが基本だからじゃないですかね?基本を学ぶには下のレイヤーで動いてるCoreFoundationが一番ですよ。
2010-03-29 22:05:00@monokakido @norio_nomura @cqa02303 ありがとうございます。CoreFoundationに足を突っ込んでみます。
2010-03-29 22:14:53@hkato193 CFRunLoopはスレッドごとに必ず存在するけど、そのWrapperであるNSRunLoopは呼ばれるまで作られないみたいです。CFRunLoop≠NSRunLoopです。
2010-03-29 22:10:02@monokakido 「CFRunLoopがスレッド毎に必ず存在する」という点が気になりpthreadで作ったスレッドに対してCFRunLoopGetCurrent()を呼んだところ、何物か分かりませんがアドレスが返ってきました。これも踏まえて更に調べてみます。
2010-03-29 22:30:22@hkato193 CFRunLoopGetCurrentを呼んだことで作られたのだと思います。必ずではないですね。「必要に応じて自動的に作られる」です。
2010-03-29 22:40:43@monokakido ありがとうございます。「CFRunLoopは必要に応じて作られる」ですね、しっかと覚えておきます。
2010-03-29 22:57:20@hkato193 QT: この辺りを読むと良いかと - iPhone Dev Center: Threading Programming Guide: Run Loops http://bit.ly/avNd1S /via @norio_nomura
2010-03-29 22:16:30@hkato193 main.m でも、必要だから作ってるんじゃ無いのかな?試した事ないけど。 UIApplicationMain の中で RunLoop が駆動されるまでに、AutoreleasePool が必要なコードが使われてるかもしれないし。
2010-03-29 22:13:04@norio_nomura 試しに適当なiPhoneAppプロジェクトを作ってmain.mで作っている階層のプールをshowPoolsでチェックしたのですが、オブジェクトは1つも登録されていませんでした。ただ、その可能性は考えられますね。
2010-03-29 22:36:31