iPhoneアプリ開発でのメモリ管理

 iPhoneアプリもAndroid同様、オブジェクト管理は組み込み端末と同様のアプローチが必要と考えた方が良いでしょう。昨今のスマホは一昔前のPCと同様のパワー、メモリを持っていますが、モバイルという利用シーンを考えなければなりません。バッテリーという限られた電力をつかい、ネットワークも途切れる事を前提とし、またスリープ/ウエイクアップというイベントに対処しなければなさて、iPhoneではGCという概念はありません。メモリー管理はリファレンスカウンタを使います。オブジェクトのリファレンスをカウントするには、インスタンスを保持するオブジェクトが、インスタンスを保持するときretainメッセージを、不要になったらreleaseメッセージを発行します。

 いわば、自前でGCすることで単独のGCメカニズムが使用するリソースを省いています。

 当然、releaseし忘れでメモリーリークがおきます。また、リファレンスの残っているオブジェクトを破棄してしまい、その後そこにアクセスしようとしてクラッシュすることも起きます。

そういった事態を避けるには、コーディングの基本ルールとして「オーナーシップポリシ ー」を守るのが有効でしょう。つまり、オブジェクトを生成したオブジェクト(オーナーオブジェクト)がそのオブジェクトを解放するように組むのです。逆に、生成したオブジェクト以外が解放するようなアーキテクチャは見通しが悪く、どのような事態が起こるか予測しにくい者になってアプリの拡張性を著しく損ないます。最初に設計した時点では良さそうに見えても、その後加わってくる機能拡張に耐えられなくなってしまうのです。(ただし、リソースプール等明確なルールで管理する方式をもてば問題はありません)

 また、releaseしたあと、変数に格納されたポインタには気をつけましょう。オブジェクトをreleaseしたら、そのような変数にはnil を代入しなければなりません。

 ある程度の規模のアプリでは、これらオブジェクトの管理が完全にできる事を担保する事を第一優先に組む必要があります。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>