落ちないiPhoneアプリが作りたい自分のための、メモリ不足でアプリが強制終了する話。

メモリが不足してもアプリは落ちない?

そう思っていた頃もありました・・・。
落ちないiPhoneアプリが作りたい自分のための、押さえておくべきポイントたくさん。
「メモリ不足でアプリが落ちる」というのは、本質的には、「メモリ警告によって解放されたオブジェクトに不用意にメッセージを送ってクラッシュする」という話でした。だから、メモリが不足しても直接的にアプリが落とされるわけではなくて、メモリ警告が生じた時の処理を適切に書かないから落ちる、という話です。

アプリが音もなく落ちる

この1点に注意して実装したら確かに落ちにくくなったのですが、時々、「アプリが音もなく落ちる」という現象が発生します。
「音もなく」というのは、デバッグモードで実行していてもクラッシュログが残らず、急にアプリが閉じてしまう、という現象です。iOS自体は生きていますがアプリは落ちます。「解放済みのオブジェクトにメッセージ云々」はtry〜catchでエラーを掴めるのですが、この現象ではそれすらもできません。

Consoleにログが残っていた

何か痕跡が残ってないかと色々調べました。
Xcodeのオーガナイザーを開いてConsoleのログを見てみると、ありました。クラッシュした痕跡が残っていました。

ここ。
ipad app exited abnormally with signal 11: Segmentation fault: 11
似たような事例。

ガチでアプリごと落とされる場合がある

メモリ警告時のviewDidUnloadは、背面のビューだけ解放する、つまり見えないところでメモリ不足を解消する、というとても優しい方式です。
しかし、それでもまだメモリが足りない場合は、バックグラウンドで動いているアプリを落としたり、今まさに動いているアプリまで落としてしまうようです。恐ろしや・・・。

解決策

ここまでくると、もうあとは「メモリを使わないようにする」ことしかできません。(もちろんProfileを使って、メモリリークは全て潰した上での話です)
幸いアプリが強制終了される前の、ごくわずかにメモリが残っている状態で、didReceiveMemoryWarningが呼ばれます。ここで、メモリに確保している画像データなどを、ファイルに保存してメモリを解放してやることにしました。これによって原因不明のクラッシュが防げるようになりました。

コメント

タイトルとURLをコピーしました