@property の使い方
前記事で説明したカプセル化ですが,実装しようとすると結構大変なのは見ればわかります。そこでpropertyという機能を使う事により典型的なアクセサメソッドの宣言,定義が行えるのです。
- (int) width; - (int) height - (NSString *) filename; - (void) setFilename:(NSString *) newFilename
アクセサメソッドの宣言もproperyを使えば,
@property (readonly) int width,height; @property (readwrite, assign) NSString *filename;
で済む。メソッドの定義も
- (int) width{ return width; } - (int) height{ return height; } - (NSString *) filename{ return filename; } - (void) setFilename:(NSString *) newfilename{ filename = [NSString stringWithString: newFilename]; }
から,
@synthesize width, height, filename;
で完了ということだ。
上記の使い方を見ると疑問に思う点として@property(...) と()の中に書かれているものがある。
この中に書いてあるものをpropertyの属性を呼び,これでアクセサメソッドの定義内容が指定できる。
属性一覧(非ARC)
アクセサメソッド名の指定
- getter =ゲッター名
- setter =セッター名
特にアクセサメソッド名の指定が必要なときに使う。
読込書込の有効性
- readonly
読み込み専用なので,アクセサメソッドがゲッターしか定義しない。
- readwrite
書き込みも可能にするため,セッター,ゲッターが共に定義される。
メモリ管理(書込が有効な時)
- assign
オブジェクトアドレスのコピー。他でreleaseすると使えなくなる。
- retain
オブジェクトのアドレスコピー。オブジェクトのメモリ管理カウントを増やす。(他でreleaseされても自分が使っているとカウントしてあるので,実質解放されていない。)
- copy
別のアドレスにオブジェクトごとコピー。 同じものを別々のオブジェクトとして利用したい場合に使う。
平行計算の有効性
- atomic
シングルスレッドで動作する。
- nonatomic
マルチスレッドで動作する。