http://d.hatena.ne.jp/mswar/20090221/1235238034 を読んで、僕もUIImageを触っているときに UIImageがキャッシュされるときとそうでないときがあったりして困ったのでまとめておこうと思う。
-initや+image系
ほかのクラスと同じように、retainCountが0になると解放される。ここまでは何も悩むことはないんですが、
+imagedNamed:
こいつはアップルのドキュメントに書いてあるように、パスをKeyとして、イメージをキャッシュする。なので、下手にreleaseするとメモリーリークが発生する。+imageAtPath:というundocumentedなAPIも同じようにキャッシュしてくれるので、同じ画像を何度も使うときには最適。
問題は、ビューアーやゲームで何度も違う画像を読み込む場合。+imageNamed:だと、どんどんキャッシュが溜まっていって、いつかはメモリが足りなくなり落ちます。僕が適当に試してみた結果、10M位を超えると落ちる感じでしょうか。この辺は環境によるかもしれませんが。
なので、基本的にはinit系で画像を作り、何度も使い回す場合はimageNamed:で読み込む。という感じでしょう。一応、undocumentedなAPIに+removeImageNameFromCache:ってのがあるけど、僕の使い方が間違っていたのか、うまく消せている感じがしなかった。
で、サンプルコード。書いてみるとやっぱりimageNamed:が使いたくなる理由はわかる。
initWithContentsOfFile:
NSString *aImagePath = [[NSBundle mainBundle] pathForResource:@"gazou" ofType:@"png"]; UIImage *aImage = [[UIImage alloc] initWithContentsOfFile:aImagePath]; aImageView.image = aImage; [aImage release];
imageWithContentsOfFile:
NSString *aImagePath = [[NSBundle mainBundle] pathForResource:@"gazou" ofType:@"png"]; aImageView.image = [UIImage imageWithContentsOfFile:aImagePath];
imageNamed:
aImageView.image = [UIImage imageNamed:@"gazou.png"];
HatenaやTwitterで皆様が色々有益な情報を交換していらっしゃるので、僭越ですが僕も受け取るだけでなく何か発信できないかと思い、この日記を立ち上げました。
皆様よろしくお願いします。
http://twitter.com/fladdict/status/1185313843 を聞いて、そういやそうか、と思い作成。見た目は以下のような感じです。
おつかれさまです!!!
どこかおかしかったらコメントくださいなー
1.2よりも1.15の方が最新版ですか...
そういえば、以前にもMac OS 10.4.9の次に10.4.10なるものが出ましたね
改めてバグ報告ありがとうございました。すぐに修正しますね。