|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
プロパティには2つの側面があります。すなわち、プロパティを宣言するための構文要素と、プロパティにアクセスするための構文要素です。このセクションでは両方の概要を述べ、この機能の背後にある目的についても説明します。
インスタンス変数へのアクセスは通常、一組のアクセサメソッド(getter/setter)を通じて行います。このアクセサスタイルのAPIを通じて管理される状態を、クラスのインスタンスのプロパティと見なすことができます。アクセサメソッドを使うことにより、カプセル化の原則が守られます(『Object-Oriented Programming with Objective-C』 > 「The Object Model」の「Mechanisms Of Abstraction」を参照)。APIのクライアントを実装の変更から隔離しながら、getter/setterペアの動作を厳格に管理でき、基本的な状態管理も実施できます。
そのためアクセサメソッドの使用には大きな利点がありますが、それでもなおアクセサメソッドの記述は手間のかかる作業であり、ガーベジコレクトされる環境と、マネージドメモリ環境の両方をサポートするコードを記述しなければならない場合は特に面倒です。また、APIのコンシューマにとって重要と考えられるプロパティの側面(アクセサメソッドはスレッドセーフか、または設定時に新しい値がコピーされるかなど)は隠されたままです。
Objective-Cの宣言されたプロパティの機能には、次の利点があります。
プロパティ宣言により、アクセサメソッドの動作方法の明瞭で明示的な仕様を指定できます。
コンパイラは、宣言で指定された仕様に従ってアクセサメソッドを合成できます。これは、コードの記述と保守が少量で済むことを意味します。
プロパティは構文上は識別子として表現され、範囲付きであるため、コンパイラは宣言されていないプロパティの使用を検出できます。
あるクラスによって宣言されたプロパティの実行時のイントロスペクション。
プロパティの宣言は、事実上、クラスのインスタンスの属性に対してsetterとgetterを宣言するための簡単な方法ですが、アクセサの動作の仕様も提供します。宣言自体のほかに、コンパイラにアクセサの合成を指示する実装ディレクティブと、実行時に自分自身でメソッドを指定することをコンパイラに伝える実装ディレクティブがあります。
コンパイラディレクティブ@propertyを使ってプロパティを宣言します。このディレクティブは、クラス、カテゴリ、プロトコルの宣言のメソッド宣言セクションの任意の場所で使用できます。
@implementationブロックの@synthesizeディレクティブと@dynamicディレクティブを使って、特定のコンパイラの動作が行われるようにします。@synthesizeは、関連するアクセサを合成するようコンパイラに指示します。@dynamicは、実行時に自分自身でメソッドを用意することをコンパイラに伝えます。
リスト 4-1は、valueというプロパティの宣言、および宣言で指定した仕様に合致するアクセサメソッドを作成するようにコンパイラに指示する@synthesizeディレクティブの使用例を示しています。
リスト 4-1 クラスにおけるプロパティの宣言
@interface MyClass : NSObject |
{ |
NSString *value; |
} |
@property(copy, readwrite) NSString *value; |
@end |
@implementation MyClass |
@synthesize value; |
@end |
ドット構文を使うと、構造体の要素にアクセスするときと同じパターンを使ってプロパティにアクセスできます。
MyClass *myInstance = [[MyClass alloc] init]; |
myInstance.value = @"New value"; |
NSLog(@"myInstance value: %@", myInstance.value); |
ドット構文は単なる「シンタックスシュガー」であり、コンパイラによってアクセサメソッドの呼び出しに変換されます(そのため実際にはインスタンス変数に直接的にアクセスするわけではありません)。上記のコード例は、次のコードと完全に同じです。
MyClass *myInstance = [[MyClass alloc] init]; |
[myInstance setValue:@"New value"]; |
NSLog(@"myInstance value: %@", [myInstance value]); |
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |