2012年1月31日火曜日

別スレッドを使うときの注意

performSelectorInBackground:等で別スレッドを造り処理を並行動作させるとき、
「スレッドではautorelease poolを別途作らなければならない。」
と、仕様書に書いてある。

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


[pool release];



別スレッドでは常にそれを作るように書いておけばいいが、
処理時間を少しでも短くしたいなら、autoreleaseを使わないのなら、その確保も省略したい。

ユーザーが直接autoreleaseを使わないならそれでもいい、と思いがちだが、
実は暗黙に使われる場合があるので要注意である。
 そのあたりは仕様書をよく読まないといけない。

たとえば、 UIGraphicsGetImageFromCurrentImageContext()は仕様書(UIKit Function Reference)にて「An autolereased object」と書いてある。
だから、これを別スレッドないで使うなら、autorelease poolの生成は必須となる。
これを忘れると、実行時にメモリリークが出る。

・・・

iOS4.xではこの通り。
ところが、iOS5ではそれが出ない。autorelease poolを自動生成してくれるようになったのか、単にエラーが出てないだけなのかわからない。いずれにしても、ちゃんと書いておくのが吉である。

0 件のコメント:

コメントを投稿