UIImageの読み替え(releaseからの再ロード)の罠。
UIImageでイメージロードしてたら、releaseしてるにも関わらず、メモリが一向に減らない・・・。
UIImageのクラスリファレンス読むとわかるんだが、どうやら一度読んだイメージをキャッシュしてくれちゃってるらしい。(限られたリソースしか使わないなら確かに便利だが)
内部的にはimageNamedに渡したファイル名と、生成されたイメージオブジェクトのポインタを対で覚えてるっぽい。
そのせいで、一度releaseしたのと同名のイメージを再度ロードした場合、そのreleaseしたはずのオブジェクトを返してくるせいか、それにさわるとBAD_ACCESS例外で止まる。
最初は、なんでこんな例外がスルーされるのか分からず、小一時間悩んでしまった・・・。
んで↓のように解決。
× UIImage* imageTmp = [UIImage imageNamed:@"imageName1.png"]; ○ NSString *imgPath = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"imageName1.png"]; UIImage *imageTmp = [ [UIImage alloc] initWithContentsOfFile:imgPath];
このようにallocとinitWithContentsOfFileを合わせる事によって、すっきりreleaseしてくれるようになった。
こうすると、キャッシュまでちゃんとクリアしてくれるようだが、その辺ドキュメント探したけど、明確に書いてあるのないな〜〜〜。
キャッシュ化、明示的に切れるようなメソッドって用意されてないもの??
[追記:2009年9月10日]
これはOS2.21以前の話であって、今(OS3.0以降)はimageNamedでもちゃんとメモリ管理してくれるみたい。であれば、キャッシュ管理してくれるimagedNamedを使わない手はないね。
参考URL
http://iphone-dev.g.hatena.ne.jp/tokorom/20090910/1252547143