iOS5になるタイミングで、XCodeもバージョンアップして、新たなコンパイラも登場して、ARC(Automatic Reference Counting)という仕組みが導入されました。
iOSアプリを開発する上で知っておきたいメモリ管理のあれこれを何回かに分けてまとめてみたいと思います。
そもそもプログラミング言語のメモリ管理の方法がどんなものがあるかと言うと、大体以下のような流れで発展して来ています。
1)プログラマ管理
2)リファレンスカウント
3)ガベージコレクション
1)は基本中の基本で、メモリの確保、解放のタイミングはプログラマが考えてプログラムする方式です。
この方式の弱点は、チームでプログラムを組むようになった場合、確保したメモリ領域の管理が煩雑になってくる事です。
チームでプログラムするようになると、後の処理まで使い回して解放する予定が、後の処理でもう1回確保してしまって、最初に確保したメモリがゴミとして残ってたとか、まだ使えると思っていた領域が解放されていたとか、チーム内の認識が合っていれば防げる事でも、何かのミスでバグが混入したりと、煩雑になってくる部分があり、リファレンスカウント方式へと発展しました。
2)は、確保したメモリを参照している数を管理しておき、ゼロになったものを解放するという方式です。
これであれば、チームでプログラミングを行っていても、自分が開発しているプログラム内で参照数を適切に管理できていれば、不意に解放されているメモリを参照するという事故や、不要になった領域の解放忘れを防げます。
iOSもこの方式で、retainで参照数をアップして、releaseで参照数を減らして、ゼロになったら解放するというのが基本です。
解放のタイミングを遅らせる為のautoreleaseというのも用意されています。
このあたりの話は以前まとめたものも参考になると思います。
iPhoneアプリのメモリ管理 その1
iPhoneアプリのメモリ管理 その2
iPhoneアプリのメモリ管理 その3
3)はリファレンスカウントをさらに発展させた考え方で、プログラマがretainやreleaseを使って明示的に参照数を計算するのではなく、言語的にメモリが参照されているかがわかるような仕組みを用意しておいて、ガベージコレクタというプログラムで不要と判断した領域を解放しようと言う発想です。
具体的なガベージコレクションの実装方法は、言語によっても違いがあると思いますが、基本的な概念として、不要になったメモリをプログラマが明示的な解放するのではなく、ガベージコレクタというプログラムが自動で認識して解放するというものです。
言語的にはJavaやC#がメジャーどころだと思いますが、Macのアプリを開発する場合のObjective-C 2.0でもガベージコレクションの仕組みが使えます。
では、ARC(Automatic Reference Counting)はどの方式なのかですが、2)リファレンスカウント方式で、今までと変わりありません。
何が変わったかというと、プログラマがretain、release、autoreleaseと書いていた部分を省略できるようになった(コンパイラが判断して補ってくれるようになった)という点だけです。
なので基本的な考え方は同じで、各コードの量や、コードの見やすさが変わったという感じです。
次回は具体的な使い方についてまとめていきたいと思います。
※iPhoneアプリ開発に関する投稿を今から始めるiPhoneアプリ開発にまとめました。
最近のコメント