@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
のところの @synthesize
で setValue
と value
という 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
- アクセッサが非アトミックになる.マルチスレッド関連.
おわり
だいたいこれくらいでプロパティ使えるようになった!
他の機能とか仕様は必要になったときにその都度みれば良さそうだ