page_adsence

2014年2月8日土曜日

アクセサメソッド

Objective-Cに限らず、オブジェクト指向言語では外部からクラスのインスタンス変数に直接アクセスすることはしません。
一般的にはインスタンス変数の値の取得や、設定にはアクセス用のメソッドを作成し、使用します。
このアクセス用のメソッドのことをアクセサメソッドと呼びます。
また、取得用のメソッドをgetter、設定用のメソッドをsetterと呼びます。

getterの作り方
getterを作成するにはインスタンス変数と同じ名前のメソッドを定義します。 例えばint型の「hoge」というインスタンス変数に対応するgetterを作成するには以下のように記述します。
// ヘッダファイル(XXXX.h)
- (int)hoge;
 
// 実装ファイル(XXXX.m)
- (int)hoge
{
    return hoge;
}


setterの作り方
setterを作成するにはインスタンス変数と同じ名前の前にsetを付けた名前のメソッドを定義します。
// ヘッダファイル(XXXX.h)
- (void)setHoge:(int)value;

//実装ファイル(XXXX.m)
- (void)setHoge:(int)value
{
    hoge = value;
}


アクセサへのアクセス方法
定義したアクセサへアクセスするためにはC言語の構造体のメンバへのアクセスのように,ドット演算子(.)を使用します。
例えば「myClass」というクラスのインスタンスの「hoge」というアクセサにアクセスするには以下のように記述します。

// getterを利用して値を取得している
int intHoge = myClass.hoge;
 
// setterを利用して値を設定している
myClass.hoge = 10;

// 通常の関数として利用することも可能
[myClass setHoge:10]


ここで1つ注意点。
setterはsetHogeというメソッドで用意したのですが、実際に使用する場合はインスタンス名にインスタンス変数名をドット演算子で繋いでいるだけという点。
ちなみに普通の関数として利用することも出来るので、上記の例のようにメッセージ式の書き方で記述することで、setterを利用することが出来る。(面倒ですが・・・)
ここまで書いて初めてPHPとかJavascriptの様に、クラスを作ってインスタンス変数にアクセスすることが出来るようになる。
Objective-Cってなんて面倒くさいんだと思った方はたくさんいると思います。
こんな面倒なことがそのままにされているはずがありません。
Objective-C2.0からはちゃんと自動で生成してくれるための機能が用意されています。
その機能というのがプロパティなのですが、それは次回にしたいと思います。