プロパティで 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 を無効化したプロジェクトで使うこともできそうです。