Edited at

Objective C のプロパティ属性まとめ

More than 5 years have passed since last update.

@property (ここ) NSString *name;

上のカッコの中のやつ。


Setter の作成有無の指定

指定無し: readwrite


readonly

setter を作らない。


readwrite

setter、getterを両方作成する。readonlyプロパティをオーバーライドする時に有用。


Setter の書き方の指定

指定無し: strong (非ARCではassign)


assign

渡された値をそのまま保持。

参照先のオブジェクトが消えた! -> ゾンビ状態になり、それにメッセージを送るとプログラムがクラッシュする。


weak

渡された値をそのまま保持。

参照先のオブジェクトが消えた! -> 自動的に nil に書き換え。


strong (昔のretain)

渡されたオブジェクトのオーナーシップを取得して保持。

参照先のオブジェクトが消えた! -> いやいや、そんなことはないって。


copy

渡されたオブジェクトの copyWithZone メソッドを呼び、結果を strong で保持。

実際にオブジェクトがコピーされるかされないかは、渡されるオブジェクトのクラス次第。

Mutable (変更可能) なオブジェクト 渡されたオブジェクトと同じ値が設定された Immutable (変更不能) なオブジェクトを作成する。(例: NSMutableArray -> NSArray)


いや俺はどうしても Mutable なオブジェクトを設定したいんだ! -> mutableCopy メソッドでコピーするような setter を自前で用意すれば可能。


Immutable (変更不能) なオブジェクト 無駄なのでコピーは作成しない。つまり、実質 strong と同じ動作。


Setter と Getter の排他関係の指定

指定無し: atomic


atomic

生成された getter と setter の中にロック処理が書き込まれる。


setter を呼び出して、それを動作している最中に getter を呼んだときには、オブジェクトの値の設定処理が完全に終わるまで待ってからオブジェクトを取得する。getter の処理中に setter が呼ばれたときは、オブジェクトの取得処理が完全に終わってから設定処理を行う。


このため、getter で中途半端なものが返ってきてアプリがクラッシュする可能性が(元々ほとんどないけど...)なくなる。


ただし、あくまでも値が「中途半端なものになっていない」ってだけで、取得した値が開発者の意図したものになっているかは別の話。それはアプリ側でちゃんと対応する必要がある。



nonatomic

ロック処理が getter と setter に書き込まれない分、高速に動作する。


SetterとGetterのメソッド名の指定


setter

setter=setValue:のようにすると setter のメソッド名を変更できる。引数が一つ付いたセレクタ名にすることに注意。


getter

getter=valueのようにすると getter のメソッド名を変更できる。