2012年11月17日土曜日

プロパティとアクセサについて

インスタンス変数のアクセスに用いるプロパティとアクセサについてメモ。

インスタンス変数のスコープはデフォルトで「protected」となっており、変数へのアクセスに専用のメソッドを通して行うように設計されています。

この専用のメソッドを通して公開されているprotected(または private)なインスタンス変数のことを「プロパティ」と呼び、そのプロパティにアクセスするためのメソッドを「アクセサ」と呼びます

アクセサについて

アクセサにはセッターメソッドゲッターメソッドという2つの専用メソッドがあります。

セッターメソッドはプロパティの値をセットするメソッドで、ゲッターメソッドはプロパティの値を取得するメソッドになります。具体的に以下のようなものです。
/*アクセサ*/
-(void)setMyValue:(int)value;  //セッターメソッド
-(int)myValue;  //ゲッターメソッド
インスタンスのプロパティ名がmyValueの場合です。ネーミングルールとして、セッターメソッドの場合はプロバティ名の前に"set"を付けて「setMyValue:」、ゲッターメソッドの場合はプロパティ名をそのまま使って「myValue」というような形になります。

以下簡単な例。

実装ファイル(.m)

#import "ViewController.h"

@interface ViewController ()
{
    int myValue;  //インスタンス変数  // *(1)
}

/*アクセサ*/  // *(2)
-(void)setMyValue:(int)value;  //セッターメソッド
-(int)myValue;  //ゲッターメソッド

@end

@implementation ViewController

/*アクセサ*/
-(void)setMyValue:(int)value  // *(3)
{
    NSLog(@"setter %d", value);
    myValue = value;
}
-(int)myValue  // *(4)
{
    NSLog(@"getter %d", myValue);
    return myValue;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    ViewController *vc = [[ViewController alloc]init];
    vc.myValue = 10; //セッターメソッド 。[vc setMyValue:10];でも記述可  // *(5)
    int i = vc.myValue;  //ゲッターメソッド。[vc myValue];でも記述可  // *(6)
    NSLog(@"%d", i);
    [vc release];
}

NSLogで値が受け渡しできているか念のため確認も。

*(1)でインスタンス変数の宣言。
*(2)でセッターメソッドとゲッターメソッドの宣言。
*(3)、*(4)で実装部の記述。

*(5)、*(6)で実際に呼び出しています。コメントにも書いているのですが、ドット演算子ではなく、メッセージ式でも呼び出すことももちろんできます。

ドット演算子でアクセスする場合は、今回の例のようにオブジェクト変数(変数vc)は具体的なクラス型である必要があります

例えばid型の場合は以下のように具体的なクラス型にキャストしてあげます。
id vc = [[ViewController alloc] init];  //id型で生成
((ViewController *)vc).myValue = 10;  //ViewController型にキャスト
int i = ((ViewController *)vc).myValue;  //ViewController型にキャスト
NSLog(@"%d", i);

おわり

このアクセサはObjective-C 2.0からは、自動的にアクセサメソッドを生成させるためのコンパイラディレクティブが導入されていて、以下のような記述で簡単に生成できます。
/* クラスの宣言部 */
@interface MyClass : NSObject {
    int myValue;  //インスタンス変数の宣言
}

@property (assign) int myValue;  //プロパティの宣言

@end

@implementation MyClass

@synthesize myValue;  // アクセサメソッドの生成

@end
もう今となってはおなじみですね。

一応覚えといて損はないだろうということで今回書きました。

参考記事

Objective-Cのクラス定義を理解しよう Page 2 - @IT
Objective-Cのクラス定義を理解しよう Page 3 - @IT

0 件のコメント:

コメントを投稿