キノコの自省録

テクノロジーとコンテンツの融合を目指して

NSAutoreleasePoolとGCD

昨日の続き。
NSAutoreleasePoolは、新しいスレッドを作成したとき、
必ずスレッドごとにNSAutoreleasePoolも一緒に作成する必要があります。
メモリ管理プログラミングガイドにも、そのように書いてあります。
C/C++,C#,Javaあたりでも、オブジェクトを生成したスレッドと、破棄するスレッドが異なると、
ほぼ確実にクラッシュするか例外をスローしてします。
NSAutoreleasePoolも同様で、iOSはそこまでケアしてくれないということになります。


じゃあGCDはどうなの?必要なの?ということですが、
GCDの場合は取り立てて必要ないようです。
ちなみにGCD(Grand Central Dispatch)は、iOSに用意されている、
並列プログラミング用の機構のひとつです。
NSThreadでスレッドを作成するよりも簡単で、省メモリで、
アフィニティも勝手に考慮してくれて高速処理してくれるという優れものです。
実際に使用する場合は、dispatch_queue_tというキューオブジェクトを生成し、
ブロック構文を使って実行します。
適当にググるとサンプルが見つかると思います。
また、並列プログラミングガイドというAppleの資料にも詳しく載っています。


で、話は戻りますが、GCDを使う場合は、キューごとにNSAutoreleasePoolが用意されるので、
絶対に用意しなければならないというものではないそうです。
ただし、昨日のエントリにも書いたように、
コンビニコンストラクタで作った一時オブジェクトが溜まりまくる可能性があるので、
for文などで大量に一時オブジェクトを生産する場合は、
NSAutoreleasePoolを適切に作ってあげる必要があります。


ちなみに、この話は、以下のQAを参考(というかほぼそのまま?)にしています。
http://stackoverflow.com/questions/4141123/do-you-need-to-create-an-nsautoreleasepool-within-a-block-in-gcd


それにしても自動解放プールという名前がなんとなく実像とあってないのではと思います。
全然自動じゃないので。
だってautoreleaseという名前だと、
スコープ抜けたら勝手に破棄してくれるんじゃないかと期待するじゃないですか。
遅延解放プールとかゴミ箱とかにのほうがあってる気がします。