ですが、インスタンス変数が多くなるにつれて、同じようなメソッドをいくつも記述する必要があり現実的ではない場合もあります。あまりにも数が多い場合にはGetter/Setterコードを出力するツールを作成したりもした経験があります。
Objective-Cではこの面倒な作業を簡略化してくれます。全てが自動的に行われるわけではありませんが、固定的なコードの生成作業は大幅に少なくなります。
プロパティの定義
@property(オプション) 型 変数名;
※オプションは省略可能で、省略された場合デフォルト値が適用されます。
以下、記述例。
@property int value; //オプションは省略 @property(readonly) int value; //オプション指定
プロパティの定義例
/******************/
/* Class Prop */
/******************/
@interface Prop: NSObject {
int value1;
int value2;
}
- (id)init;
- (void)dealloc;
- (void)printValues;
//value1はGetterのみ(読み取り専用)
//- (int)value1;
@property(readonly) int value1;
//value2はGetter/Setter両方定義
//- (int)value2;
//- (void)setValue2:(int)v;
@property(readwrite) int value2;
@end
プロパティの実装
プロパティの実装は@propertyを使ってインタフェースが定義されている場合に次のように記述することで、Getter/Setterメソッドを記述した事になります。
@synthesize 変数名;
@propertyのオプションにもよりますが、上記の定義を1行記述することで、GetterとSetter(readonlyオプションが指定されていない場合)が実装された事になります。
プロパティの実装は以下のように複数のプロパティをカンマでつなげて定義することも出来ます。
@synthesize value1, value2;
プロパティの実装例
//Propクラス実装
@implementation Prop
- (id) init {
self = [super init];
if (self != nil) {
value1 = 1;
value2 = 2;
}
return self;
}
- (void) dealloc {
printf("Prop was released.\n");
[super dealloc];
}
- (void) printValues {
printf("value1 = %d, value2 = %d\n", value1, value2);
}
//プロパティvalue1の実装部
@synthesize value1;
//以下のアクセサを実装していることとと同等
//Getter(value1)
//- (int) value1 {
// return value1;
//}
//プロパティvalue2の実装部
@synthesize value2;
//以下のアクセサを実装していることとと同等
//Getter(value2)
//- (int) value2 {
// return value2;
//}
//Setter(value2)
//- (void) setValue2: (int)v {
// value2 = v;
//}
@end
@propertyに指定可能なオプション
| 種類 | オプション | 意味 |
|---|---|---|
| メソッド名指定 | getter=ゲッタ名 setter=セッタ名 | ゲッタメソッド、セッタメソッドを明示的に指定する。 |
| 読み書き属性 | readonly | 読み取り専用 |
| readwrite | 読み書き可能(デフォルト値) | |
| 値の設定方法 | assign | 代入 |
| retain | 保持 | |
| copy | コピー | |
| アトミック性 | noatomic | アトミック性無し |
プロパティへのアクセス。ドット演算子
プロパティへのアクセスはドット演算子を利用してアクセスします。/****************/
/* main */
/****************/
int main(void) {
//AutoreleasePool
id pool = [[NSAutoreleasePool alloc] init];
Prop *prop = [[[Prop alloc] init] autorelease];
//初期値を表示
[prop printValues];
//値の取得(value1)
//ドット演算子によるアクセス
printf("value1 = %d\n", prop.value1);
//値の取得と設定(value2)
//ドット演算子によるアクセス
printf("value2 = %d\n", prop.value2);
prop.value2 = 20;
//値を表示
[prop printValues];
//自動開放プールの解放
[pool release];
return 0;
}
詳解 Objective-C 2.0 第3版
posted with amazlet at 13.04.13
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 5,145
ソフトバンククリエイティブ
売り上げランキング: 5,145
0 件のコメント :
コメントを投稿