プロパティで ARC を使用する - Automatic Reference Counting

SPECIAL


プロパティで ARC を使用する

ARC (Automatic Reference Counting) が有効の場合、クラスのプロパティでも、その制御に合わせたプロパティを定義できるようになっています。

なお、どのプロパティも従前から、新しい値を代入する際には、例えば retain プロパティなら既存の値を release してから代入するなど、既存の値を気にせずに値を設定できるようになっているところは、ARC でもそうでなくても変わりません。

 

@property (strong,readwrite) TYPE* name;

__strong 制御レベルのプロパティになります。扱いとしては、従前の retain によるプロパティと同じ感じになるのでしょうか。

__strong で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

@property (weak,readwrite) TYPE* name;

__weak 制御レベルのプロパティになります。いわゆる delegate の呼び出し先を保持する際に、便利な制御レベルになるのでしょうか。

保持しているオブジェクトは retain されないので、相互参照の状態でも、お互いが見合って dealloc が呼び出されなくなるという心配が要らなくなります。

また、retain はされないものの、そのオブジェクトがどこか別の場所で解放されても、その時には保持している値が nil になるため、解放済みのオブジェクトに対してメッセージを送って例外エラーで落ちてしまうといった心配もなくなります。

__weak で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

@property (unsafe_unretained,readwrite) TYPE* name;

__unsafe_unretained 制御レベルのプロパティになります。扱いとしては、従前の assign によるプロパティと同じ感じになるのでしょうか。

__unsafe_unretained で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

このほかにも、従来通りの assign, retain, copy についても、ARC 環境でも宣言することができるようになっていました。

 

@property (retain,readwrite) TYPE* name;

値を保持する際に、渡された引数の参照カウントを 1 増加させて保持するタイプのプロパティになります。

__strong で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

@property (copy,readwrite) TYPE* name;

値を保持する際に、渡された引数の値を複製して retain するタイプのプロパティになります。

通常は、NSCopying で定義されている copyWithZone: メソッドを使用した copy メソッドでの複製を作成して、それを内部に retain で保持する形になると思います。

__strong で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

@property (assign,readwrite) TYPE* name;

値を保持する際に、渡された引数の値を assing で保持するプロパティになります。

参照カウンタには関与しないため、保持しているオブジェクトがどこかで解放されて無効になっても、そのオブジェクトのアドレス情報をそのまま保持し続けます。もちろん、解放済みのオブジェクトを操作しようとするとエラーになります。

__unsafe_unretained で定義された変数に対して @synthesize による setter, getter の定義が可能です。

 

このようにしてプロパティを定義することになるようです。

ARC を有効にしていないときに使用する "assign", "retain", "copy" も宣言できるようになっているので、ソースコードの一部を ARC を有効にした静的ライブラリにまとめて ARC を使って実装して、その静的ライブラリを ARC を無効化したプロジェクトで使うこともできそうです。

[ Automatic Reference Counting 目次へ ]