Hatena::Groupiphone-dev

iOS プログラミングメモ

2008-12-06 (Sat)

祝 SkyBook ベスト10入り 13:57  祝 SkyBook ベスト10入り - iOS プログラミングメモ を含むブックマーク

ありがとうございます。本当ありがとうございます。

f:id:ktakayama:20081206140714j:image:w400

メモリ問題 22:23  メモリ問題 - iOS プログラミングメモ を含むブックマーク

我輩は猫である」のサイズが1MBちょっとの作品でして、これが動くのを基準に作ってたんだけど、海島冒険奇譚 海底軍艦 なんていう2MBオーバの作品がある事をレビューで知りました。調べてみたら、1.5MBを超えてる作品が5個ほどありまして、そのうちの2MB以下の3作品は処理出来たんですけど、残り二つはクラッシュするところか端末が再起動すると言う何とも悲しい結末に…。

前に書きましたが、「我輩は猫である」のダウンロード時に使用するメモリ量は30MB近くになるので、明らかにメモリ不足が原因です。というわけで、どうにかメモリを無駄使いしないやり方を考えていたのですが、意外とあっさり解決出来ました。

詳しくは以下参照の自動開放プールをホゲるやり方でいきました。

この方法に行き着く前は、処理を細かく分離しようかと思ったのですが、それって結構面倒くさいしバグ出ちゃう可能性もあるしで悩んでいました。そんなこんなで考えていたら、上記の自動開放プールの話を思い出したので、さくっとループの中に入れて試してみました。すると劇的にメモリ使用量が減るじゃないですか。試しに「我輩は猫である」でチェックしてみると、マックス6MB程度のメモリしか使用しないで済みました。

それでまあ、一つだけ問題があって、[pool release] が重いんですわ。ループの中で毎回やると、とってもパフォーマンスに影響するわけです。なので、これをやる場合はループの中でも数回に分けて実行するようにした方が良いかと思われます。

私はこんな風にやってますが、十分な効果を得る事が出来ています。

NSAutoreleasePool *lpool;
int i = 0;
while(obj = [enu nextObject]) {
   if(i % 500 == 0) lpool = [[NSAutoreleasePool alloc] init];

   // hogehogehogehoge

   if(i % 500 == 0) [lpool release];
}

もちろん回数は適当に調整してくれればいいかと。

お陰で「海島冒険奇譚 海底軍艦」もダウンロード出来るようになりました。

ART2ART22008/12/06 21:20おめでとうございます。
VerUPするたびにスピードアップしているような。
すごいですね。
ところで、「書籍データベースの更新機能」が新しく追加されたとありますが、どんな機能ですか?
内部処理の変更?

ktakayamaktakayama2008/12/06 22:29どうもです。
視覚効果とか入れたりして、体感速度の向上も図ったりしてます。
データベースの更新機能はですね、Downloads タブを開くと「作家一覧」と書いてある左側に矢印マークが出ているのですが、これです。こいつをタップすると、ローカルの書籍データベースを最新のものに更新してくれます。青空文庫では、毎日のように新作が公開されているので、それに追従するための機能です。いまはわかりにくい状態ですが、いずれ「最新の作品」という一覧画面を追加して、新しい作品を見れるようにしようと考えています。

typhoon_516typhoon_5162008/12/07 23:16ダウンロードさせていただきました。
まさかこんなアプリがあったとは…読書好きにはたまらないアプリです!
フォントサイズや行間がカスタマイズできるので、
自分の読みやすい表示にできるのがとても良いですね。
あと、作家一覧画面で右側に五十音が表示されていて、
タッチするとその瞬時にその音に移動するのが何気に便利です。


ただ少し改善して欲しいところも…
まず、スクロールで徐々にページを進めていけるようにしていただきたいです。
今はスクロール中に指を離すと瞬時に元に戻るか次ページに行く状態ですが、
指を離した位置でそのまま止められるようにしていただきたいのです。
普通のアプリだと「キビキビ軽快に動く」のが良いのかもしれませんが、
読書は文の流れが大事なので急にパッと動かれると読んでいる部分がわからなくなって
流れが止まってしまうんですよね…
できればSafariのように自分の好きな位置にスクロールできるような設定追加をお願いします m(_ _)m

ktakayamaktakayama2008/12/08 15:00ご購入ありがとうございます!

スクロールのお話は、iVBook がそんな感じの動きですね。
確かにその方がいい場合もあるのでしょうが、コアな部分なのでなかなか変更しにくいです。
他にも似たような要望は頂いているので、じっくり考えておきます。

通りすがり通りすがり2008/12/12 14:05プールのアロケートと解放はループの外にして、
ループ内でのメモリ解放は drain でやった方が
スマートだと思います。

ktakayamaktakayama2008/12/14 01:02なるほど、ということは…
プール作成
ループ& drain
プールrelease
って感じでしょうか?
確かにこっちの方がエレガントですね。ありがとうございます。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20081206