Objective-C 2.0 の Property メモ
Objective-C 2.0からは、.構文を使ってオブジェクトのプロパティにアクセスすることができる。
でも実際に中身は、[hoge get変数名] [hoge set変数名:]と言った感じで下位互換を(無理矢理?)保っている。
間違ってる所がぽつぽつあると思うので、間違ってる所があれば突っ込んで下さい。m(_ _)m
宣言方法 @interfaceブロックと@implementationブロック
双方に、プロパティを使うという宣言が必要。
宣言方法 @property
クラス変数の属性を設定するディレクティブ。これは、@interfaceブロック内に記述する。
@property (copy, readwrite) NSString* value; @property (retain,readonly) NSWindow* window;
__weakと__strongも関わってくるけど後述
@property に記述できる事。
- getter=getterName, setter=setterName
- そのまま、getterとsetterの名前を設定する。
- readonly
- プロパティが読み込み専用と宣言する。デフォルトでは、readwrite。
- readwrite
- プロパティが読み書きできると宣言する。もし、@synthesizeもしくは@dynamicを宣言しない場合、getter,setterを一緒に宣言する必要がある。
- assign
- 単純代入をあらわす。デフォルトではこれが適用。GCを使用していないと、単純代入ではコンパイルエラーが発生。
- retain
- 代入時にretainを呼び出す必要がある事を指定。Core Foundation/CF*のオブジェクトに対してはretainできない。
- copy
- 代入時にcopyを使用する。その際、オブジェクトはNSCopyingプロトコルが実装されている必要がある。上記のNSStringはNSCopyingが実装されているが、NSWindowは実装されていないので、前者はcopyもしくはretain、後者はretainとする事になる。
- nonatomic
- アクセサが非アトミックになるように指定。通常では、アクセサはアトミック状態で、マルチスレッド環境でプロパティへのアクセスを可能にしている。詳しくは「日本語ドキュメント - Apple Developer」を見ろとの事。
宣言方法 @synthesize と @dynamic
双方とも、@implementation に書く。それぞれ、getter,setterに関する事。
- @synthesize
- setter,getterを指定しない場合に、コンパイラにその変数は合成する必要があると伝えるディレクティブ。
@synthesize hoge; // getHoge,setHogeを実装しなくてよくなる @synthesize gender = sex; // getGender, setGender という感じでアクセス。self.genderとアクセスすれば、プロパティsexに値が入る。
「フラジャイルな〜」の下りは、私には理解不能。後でじっくり読む。
- @dynamic
- 他の構造を使って実装する時に、コンパイラに伝える方法。つまり、自分で実装する時に使用。
「.構文」
ほとんど、[hoge get...] [hoge set...] がそのまま.構文に取って代われたような感じ。
例。
// 以下の2行は同意 [hoge setLang:@"ja"]; huge.lang = @"ja"; // 以下の2行は同意 NSLog(@"%@", [hoge getLang]); // > ja NSLog(@"%@", huge.lang); // > ja // 以下の2行は同意 hoge.length = 10; [huge setLength:10]; // 以下の(ry hoge.length += 10; [huge setLength:[huge getLength]+10]; NSLog(@"%d", hoge.length); // > 20 NSLog(@"%d", [huge getLength]); // > 20
- オブジェクト内で使う場合の注意
- self.ageとageは別の意味になるので注意。
.構文は複数続いても行ける。
hoge.huge.length