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 件のコメント:
コメントを投稿