@property を使ってみる

はじめの一歩

まずは一番簡単な使い方から.

#import <Foundation/NSObjCRuntime.h>
#import <Foundation/NSString.h>

@interface MyObject : NSObject
{
  NSString* value;
}
@property(copy, readwrite) NSString* value;
@end

@implementation MyObject
@synthesize value;
@end

int main() {
  MyObject* obj = [MyObject alloc];

  [obj setValue:@"Hello, World!"];

  NSLog(@"%@", [obj value]);

  return 0;
}

@interface@property を宣言しておいて,@implementation のところの @synthesizesetValuevalue という 2 つのメソッドを作ってくれる.

あと,obj.value (ドット構文) でもアクセスできちゃう.

インスタンス変数とプロパティの名前を違うものにする

インスタンス変数名とプロパティ名を変えたい場合,@synthesize {プロパティ名} = {メンバ変数} ってやれば OK

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
{
 @public
  NSString* memberValue;
}
@property(copy, readwrite) NSString* value;
@end

@implementation MyObject
@synthesize value = memberValue;
@end

int main() {
  MyObject* obj = [MyObject alloc];
  [obj setValue:@"Hello, World!"];

  NSLog(@"access use property: %@", [obj value]);
  NSLog(@"access directory: %@", obj->memberValue);

  return 0;
}

setter と getter を自分で定義する

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
{
 @public
  NSString* value_;
}
@property(copy, readwrite) NSString* value;
@end

@implementation MyObject
@dynamic value;

- (NSString *)value {
  NSLog(@"in value getter");
  return value_;
}

- (void)setValue:(NSString*) newValue {
  NSLog(@"in value setter");
  value_ = [newValue copy];
}
@end

int main() {
  MyObject* obj = [MyObject alloc];
  [obj setValue:@"Hello, World!"];

  NSLog(@"access use property: %@", obj.value);

  return 0;
}

@implementation の中で @dynamic value ってやっておけば OK

プロパティの動作とかの指定

プロパティの宣言属性っていうのでプロパティの細かい動作を指定できる.

@prpoerty(attributes)attributes のところをいろいろ指定できる.

ざっとまとめる.

getter={getterName}
getter の名前を {getterName} に指定.デフォルトはプロパティ名と同じ.これは,Key Value Coding の規約に従っている.引数なしでプロパティと同じ型を返す.
setter={setterName}
setter の名前を {setterName} に指定.デフォルトは setプロパティ名.同じく,Key Value Coding の規約に従っている.プロパティと同じ型の引数で何も返さない (void を返す)
readonly
読み取り専用.setter は定義されない.ドット記法で値を代入しようとすると怒られる.
readwrite
読み書き可能.デフォルトはこれ.getter と setter の両方定義しないとダメ.
assign
setter で単純代入を使用するようになる.デフォルトはこれ.
retain
setter で retain される.
copy
setter で copy がセットされるようになる.
noatomic
アクセッサが非アトミックになる.マルチスレッド関連.

おわり

だいたいこれくらいでプロパティ使えるようになった!

他の機能とか仕様は必要になったときにその都度みれば良さそうだ