Hatena::Groupiphone-dev

grimleaperの開発日誌

ついったー

2009-02-21UIImageとキャッシュ

UIImageとキャッシュ

| 05:26

 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"];

 これ以外にもimageNamedとそれ以外では違いがある。それはUIImageViewに画像を貼付けたときに顕著なのだけれど、最初の一回目でも、imageNamedで画像を読み込んだ方が早い。1Mくらいの画像ファイルを用意して、それをスクロールに従って順に表示するようにした場合、imageNamedとそれ以外ではUIのもたつき具合が全く違う。理由は不明。imageAtPath:でも同じように高速で動くので、init系とは全く違う何かがあるのかもしれない。

sftyv2sftyv22013/12/17 16:21渡辺麻友 水着画像
http://www.gazouzou.com/AKB48/watanabe-mayu/

2009-02-08UIChangesNotificationView update

2009-02-07日記始めました

UIChangesNotificationView

| 19:18

 http://twitter.com/fladdict/status/1185313843 を聞いて、そういやそうか、と思い作成。見た目は以下のような感じです。

f:id:grimleaper:20090207191214p:image


使い方:

 UIChangesNotificationView.hをあらかじめimportしておき、画像のようなAlertを出したいところで次のコードを実行してもらえばOKです。

[UIChangesNotificationView notifyChangesIfNeeded];

 これを実行すると、現在のバージョンとアップデート前のバージョンを比較して、更新があった場合だけアラートが表示されます。ここ以外にコードを書き直したりする必要はありません。

 コードの方の更新はこれだけでいいのですが、これとは別に、ChangesLog.plistという、どのバージョンで何の新機能が追加されたのか、を定義するファイルが必要です。

 中身は辞書の配列で、個々の辞書は次の要素を持っています

  1. version ( Number:必須 ) バージョン情報
  2. en ( Array[Strings]:必須 ) ユーザーが英語環境の場合に表示されるもの
  3. その他言語リソース:推奨

 zipの中にサンプルがあるのでそちらを参考にしてください。

問題点:

  1. 貼付けたUIWebViewが、なぜか横移動できる。
  2. 更新したものを翻訳するのがめんどい

 まだ駆け出しのプログラマーが作ったコードですので、いろいろ問題点があるかと思います。なにか問題があれば教えていただけると助かります。

ダウンロード

https://dl.getdropbox.com/u/339199/AppChangesNotification.zip

fladdictfladdict2009/02/07 21:40ちょwwww、さっき作り始めたのにできてるwwwwww
おつかれさまです!!!

grimleapergrimleaper2009/02/07 21:46けっこう暇だったのですw
どこかおかしかったらコメントくださいなー

fladdictfladdict2009/02/08 10:30ちょっと気になることが。 iTunesConnect の挙動みてると。 ver 1.2 と 1.15 があった場合、 1.15 が最新として判断されるようです。 メジャーバージョン 1, マイナーバージョンが 2 と 15 になるみたいですね。なので単純に > で判別すると、2桁バージョンを拾えないです。 最後にラウンチしたときのバージョンと、現在のバージョンがことなりディクショナリに現在のバージョンが存在する、で判別するといいかもしれません。

grimleapergrimleaper2009/02/08 17:29バグ報告ありがとうございます。

1.2よりも1.15の方が最新版ですか...
そういえば、以前にもMac OS 10.4.9の次に10.4.10なるものが出ましたね

改めてバグ報告ありがとうございました。すぐに修正しますね。

BubberBubber2011/09/16 12:57Great post with lots of impotrnat stuff.

cutfkecutfke2011/09/16 21:05CjWKlx <a href="http://oxdjjpoawpdb.com/">oxdjjpoawpdb</a>

jqhqdunjqhqdun2011/09/17 01:38sVr4zc , [url=http://kwmakyuqbufb.com/]kwmakyuqbufb[/url], [link=http://ayifqrqtrsap.com/]ayifqrqtrsap[/link], http://vocecpwidbuq.com/

wxkxfmzvvwxkxfmzvv2011/09/19 00:23R8OalA <a href="http://nslptjdhtjfc.com/">nslptjdhtjfc</a>

lozmoalozmoa2011/09/19 19:56CGXY49 , [url=http://zmdqtzldxkzy.com/]zmdqtzldxkzy[/url], [link=http://szqwlnwldnve.com/]szqwlnwldnve[/link], http://tgtotxitqswr.com/