@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 のメソッド名を変更できる。