iPhoneで、NSURLConnectionなどネットワーク通信はキャッシュが作成されます。 ここだけ読むと、2度目以降はキャッシュからデータを取ってくれる良い仕組みだな〜 で終わってしまうんですが、これには幾つかの罠があります。 まず、iOSでのキャッシュの特徴を上げてみます。
- キャッシュはメモリにのみで、ディスクにはキャッシュされない
- メモリキャッシュの容量はデフォルトで512KB
- メモリキャッシュの容量は変えられる
- メモリキャッシュのみなので、アプリを終了させるとすべてのキャッシュは消える
キャッシュ機能は必要?
さて、ここからが本題ですが、はたしてこのキャッシュ機能必要でしょうか? ネットワークで通信をするというのはどういう時があるでしょうか? 自分は大まかに分けて2つあると思っています。
- WebViewを使ってネットサーフィンをするとき
- twitterクライアントなど、APIを使って可変なデータをDLするとき
このうち、WebViewを使ってネットサーフィンをする場合、戻るボタンを押す可能性があるのでキャッシュは会ったほうがユーザーのためでしょう。 しかし、APIを使うときは戻るボタンを押すという行為はないですし、更新ボタンを押したときは最新のデータが欲しいのでキャッシュは邪魔ですし、必要ないのではないでしょうか? 逆にキャッシュがあることにより、キャッシュ用のメモリ確保・解放に時間を使ってしまい、少ないメモリを消費してしまいます。
キャッシュ機能をオフにする方法
そんなあんまり使わなそうなキャシュをオフにするのは簡単で、一行書くだけです。
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
こちらをAppDelegateのapplication:didFinishLaunchingWithOptions:あたりに書いてあげればキャッシュが生成されなくなります。 ちょっと自分の意見も入って熱くなってしまいましたが、 メモリ不足を解消する一つの手法として、キャッシュを使わないという手段があり、 キャッシュの利用率から考えるとかなり有効な手段ではないかな、というお話でした。