happy_ryo

2014.03.17

Objective-C で property につける属性についてお復習いする

IDE が自動で付けてくれるから、各々の意味が良くわからない、という話しを聴きました happy_ryo です。

この属性を理解しないまま、property のセッター/ゲッターを自身で定義すると面倒な事になる場合もあるので、今回はそれぞれの属性の簡単なまとめを書きます。

property 自体が値を所有する時の属性

assign

整数や、文字列型の property にこれをつけます。この属性のついた property は値がセットされる時、引き渡された値を property へそのまま代入します。

strong

この属性が指定された property に対して値がセットされる時、既にセットされている値がある場合は release が行われ、引き渡された値に対して retain が行われてから、property に値がセットされます。

copy

この属性が指定された property に対して値がセットされる時は、strong の場合と異なり、渡された値のコピーがセットされます。

property 自体は値を所有しない時の属性

weak

渡された値が retain されないまま property にセットされます。
セットされている値が retain されて居ないので、既に値がセットされていても release は行われません。渡された値が破棄された場合、property には nil がセットされます。

unsafe_unretained

渡された値が、retain されないまま property にセットされます。 weak と違い、渡された値が破棄された場合でも property の値を nil に書き換えません。

property の読み書きに関する属性

readonly

この属性を指定すると property に対して、コンパイラがアクセサメソッドを合成する場合に、ゲッターのみしか生成しなくなります。

readwrite

この属性が指定されていると、コンパイラがアクセサメソッドを合成する場合に、セッター/ゲッターの両方を生成します。

その他

nonatomic

通常、コンパイラがプロパティに対してアクセサメソッドを合成する場合、それらのメソッドはアトミック性が保証されるが、nonatomic 属性を指定すると、アトミック性が失われます。nonatomic を指定しないと、property は atomic として扱われますが、パフォーマンスが低下するため推奨されません。