今回はiOSアプリ開発ネタです。
iOS5で導入されてしばらくたってしまったARCですが、
今まで使ってきませんでした。
最近、ARCを使う機会があったので、
調べてみました。
ARCの基本
ARC (Automatic Reference Counting) とは、
「自動リファレンスカウンタ」のことです。
コンパイルの際に「retain」や「release」などのメソッドをコンパイラが挿入してくれるもので、書かなければならないコードが減るという便利なものです。
しかし、「一定のルール」に従う必要があります。
retain, release, autoreleaseは書かない
・retain, release, autoreleaseはコンパイラが挿入してくれるので、コンパイラに任せます。(自分で呼んではいけません)
・deallocもコンパイラに任せます。(直接deallocを呼び出していけません。deallocのオーバーライドは可能ですが、[super dealloc]は呼び出してはいけません)
メモリ管理の基本的な仕組みは、手動メモリ管理と同じです。
「retain, release, autorelease」を使う代わりに、
「強い参照」と「弱い参照」という概念を導入して、
コンパイラに自動挿入してもらいます。
強い参照と弱い参照
「強い参照」と「弱い参照」を使い分けてオブジェクトを利用します。
強参照 :
参照先のオブジェクトを自分で保持します。
強参照されているオブジェクトは常に利用可能で、
強参照されなくなったり、スコープ外に出た場合は破棄されます。弱参照 :
参照先のオブジェクトを自分で保持しません。
参照先のオブジェクトが誰からも強参照されなくなったとき、自動的にnilが代入されます(Zeroing)
という考え方が基本になります。
あるオブジェクトを保持したい場合は強参照します。保持しない場合は弱参照します。
「循環参照」を避けるために、二種類の参照が存在します。
「 __strong」や「__weak」などの修飾子を使って「強い参照」と「弱い参照」のどちらなのかを示します
強い参照 : __strong
デフォルトは強い参照ですので、通常は指定する必要はありません。
alloc/initで生成されたオブジェクトは、現在のスコープ(多くの場合、変数が宣言された中括弧内)のライフタイムの間、維持されます。
nilで初期化されます。弱い参照 : __weak
delegateパターンを使うときなどは、相互循環を防ぐために弱い参照を使います。
nilで初期化されます。
iOS4では使えません。その他 :
__unsafe_unretaind :
__weekが使えないiOS4ではこれをつかいます。nil初期化やZeroingが行われません。__autoreleasing :
手動メモリ管理の時にautoreleseメッセージを送信していたのと同様の働きになります。
nilで初期化されます。
強参照されているオブジェクトも、変数スコープ外に出れば破棄されるので、あえてこれを使うことは稀です。
その他
ARCで使えないものに以下のものがあります。
・NSAllocateObject, NSDeallocateObject
・C構造体の中でのオブジェクトポインタ
・NSAutoReleasePool (@autoreleasepoolブロックの使用は可能。)
・メモリゾーン
・“new”から始まるプロパティ名
その他に、CとObjective-C間のキャストには特定の方法を利用する必要があります。
まとめ
ARCを利用する際の基本的なルールを掴むことができました。
次回は、これらを踏まえて、どういった形でコーディングしていくのかというマイルールをまとめたいと思います。
参考ページ
[iOS5] ARC (Automatic Reference Counting) : Overview
Objective-C ARCによるメモリ管理
「[Objective-C] 今さらですが、ARC超入門 (1)」への2件のフィードバック