2012/04/25

@propertyとAutomatic Reference Counting (ARC)

Objective-Cは段階的に進化してきたため、ネットで情報を検索する際には対象としている世代に注意する必要があります。特に、ARC導入前後はかなり考え方が変わっているので、簡単にまとめてみました。

共通の考え方

オブジェクトには参照カウンタが存在し、参照カウンタが0になった時点でオブジェクトは解放されます。JavaのGCのように定期的にメモリ解放が行われるのではなく、カウントが0になった時点ですぐにメモリが解放されます。

@property導入前

Next STEP時代から続くメモリ管理手法で、参照カウンタはすべてプログラマが手動で管理します。retainで参照カウンタを増やし、releaseもしくはautoreleaseで参照カウンタを減らします。setterもプログラマが明示的に記述し、必要に応じてretain/releaseを行います。

ARC導入前の@property (retain,assign世代)

@propertyに「retain」を指定した状態で@synthesizeを利用してメソッドを生成すると、「setするオブジェクトをretainし、以前setされていたオブジェクトをreleaseする」という処理を自動的に生成してくれます。あくまでも「プログラマの代わりにsetterを書いてくれる」だけなので、@synthesizeされたsetter以外では効果がありません。

ARC導入後の@property (strong,weak世代)

Automatic Reference Countingの名が示す通り、retain/releaseはすべて自動的にコンパイラが生成します。逆に、プログラマは明示的にretain/releaseを行うことはできません。簡単に書くとポインタを強参照(strong)と弱参照(weak)で区別し、強参照が増える場合にはretain、減る場合にはreleaseがコンパイラによって挿入されます。@propetyのstrong,weakで、その変数を強参照にするか弱参照にするかを定義します。当然、@synthesizeされたsetter以外でも効果があります。

ARCを使用するべきか?

使わない理由はないと思います。
ARCはコンパイル時のオプションであり、プロジェクトの一部分だけにARCを使用することもできます。また、ターゲットがiOS4の場合でも使用可能です。(ただしiOS4ではweakポインタが使えないので、zeroingのない__unsafe_unretainedポインタを使用します。)

0 件のコメント:

コメントを投稿