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