Hatena::ブログ(Diary)

mswar的電網日誌 このページをアンテナに追加 RSSフィード

2009-02-21

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

grimleapergrimleaper 2009/02/22 05:43 こんにちは
僕も同じようなimageNamedのキャッシュに悩まされたことのあるクチなので、今回の記事はとても人事とは思えず、思わず似たようなモノを書いてしまいました。

>キャッシュ化、明示的に切れるようなメソッドって用意されてないもの??
undocumentなものに、+imageAtPath:と+ removeImageNameFromCache:というメソッドがあるので、これ以外はキャッシュに関わらないと僕は勝手に考えています。removeImageNameFromCache:の正しい使い方がわかれば、imageNamedで困ることはないんですけどね...

mswarmswar 2009/02/22 14:14 なるほど、undocumentなAPIだとあるんですね。将来的に導入されたりするのかも。。。
やぱりエリカ様の本読むべきか。。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証