@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

 マルチスレッドで動作する。