彩えんぴつを売り出して8か月になりますが、
ここ最近になって画面がブラックアウトすると日本の方からご指摘を受けたり、
海外の方から"This app has generated a black screen 3 times"(確かに多い)と
メッセージを戴いたりしまして…頻繁に発生するようになってしまいました。
とはいえ、開発コードの流れの上で、問題がないはずです。それなら8か月の間にかなり出てくるはず。
iPhoneOS3.1.3や3.2の上でよくデバッグしましたし、さほど大きな不安はありません。
ブラックアウト自体はiPhoneOS3.1.3の頃に確認しており、
早い段階でメモリ確保と節約の処理を含めることで対処できていました。…そのはずでした。
しかしiOS4からマルチタスクが可能になり、メモリ管理が複雑化したため、より要求がタイトになり、
ブラックアウトが発生しやすくなってしまったのだろうと思われます。
という流れから、ブラックアウトの遠因はメモリ不足であることは推測できていたのですが、
なぜアプリが落ちずにブラックアウトするかは分かっていませんでした。
しかしその原因がようやくつかめました。ポイントはUIViewControllerの仕様です。
UIViewControllerのサブクラスは、メモリ不足になるとviewを自動的に解放する仕組みを持っています。
そして解放されたviewが再度呼び出されたときに再生成するのですが、ここでうまく生成できないと、
viewが存在しない=ブラックアウトという結果になる…これが原因でした。
メモリ不足の警告が出たとき、UIViewControllerのdidReceiveMemoryWarningが呼ばれます。
その時OS側が必要と判断するとUIViewControllerのviewDidUnloadをコールし、viewを解放しメモリを確保します。
解放されたviewが再度呼び出されたとき、UIViewControllerは再度viewDidLoadをコールし、viewを再生成します。
彩えんぴつはviewの構築コードがviewDidLoadに含まれたコードだけでは足りなかったため、viewが復活しませんでした。
iOS4になって他のアプリがメモリを食っている場合、自分のアプリにも影響してきます。
自分のアプリは省力に努めても、他アプリがメモリを食いつくしていた場合はNGとなります。
よって、iOSアプリを作成する際は、
・viewはメモリ警告で自動解放されるモノ(viewDidUnloadできれいにお片づけする)
・viewDidLoadで再生成するモノ
と考えるのがよさそうです。
ここを守れば、iOSが適切にバックグラウンドのアプリを解放してくれるので、
メモリに関してあまりうるさくならなくても済むようになります。
しかしこれを知ったのが最近って言うのはやっぱり僕が邪道だからですかね…
文章読むのが苦手なので、ガイドの読み下しが少ないのがいけないのだと思いました……すごく反省です。
次々回更新予定の彩えんぴつver1.5.2からブラックスクリーンの回数はかなり減ると思います。
お買い上げくださった方々にはご迷惑おかけしておりますが、今後ともどうぞ宜しくお願いいたします。