2011年3月6日日曜日

Objective-C(プロパティ)

インスタンス変数にアクセスする方法として、GetterとSetterを自前でコードを記述し、インスタンス変数へのアクセサを提供する方法があります。これはJava/C++等のオブジェクト指向言語で一般的に利用される方法だと思います。
ですが、インスタンス変数が多くなるにつれて、同じようなメソッドをいくつも記述する必要があり現実的ではない場合もあります。あまりにも数が多い場合には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版
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 5,145

0 件のコメント :

コメントを投稿