[Objective-C] 今さらですが、ARC超入門 (1)

今回は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件のフィードバック

コメントを残す

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

CAPTCHA