プロパティ
文法として拡張されたのは、プロパティだ。プロパティは、クラスのインスタンスに付け加える属性で、手早くアクセスできる。
例を紹介しよう。Personというクラスに、nameというインスタンス変数があるとする。このとき、次のようにプロパティを設定できる。
@interface Person : NSObject
{
NSString* name;
}
@property(readwrite) NSString* name;
@end
「@property」がプロパティを宣言するための構文だ。宣言したプロパティは、次のように実装する必要がある。
@implementation Person
@synthesize name;
@end
これで、コンパイラがnameのためのアクセッサメソッドを作ってくれる。
インスタンス変数をプロパティとして宣言すると、新しい文法を使ってアクセスすることが可能だ。ドット構文が使える。
Person* steve;
steve = [[Person alloc] init];
steve.name = @"Steve";
NSLog(@"name is %@", steve.name);
従来は、アクセッサメソッドをすべて手で実装しなくてはならず、またアクセスするときもメソッド呼び出しを書いていたが、これらの手間が大幅に省けることになる。
ではただのシンタックスシュガーかというと、そうでもない。まず、プロパティには、上記のreadwriteのように、属性を指定することができる。これらには、getter=、setter=、readonly、readwrite、assign、retain、copy、nonatmoicがある。さらに、プロパティをコンパイルするためのメタ情報が付加される。これによって、ランタイムに最適化を行う機会が与えられる。
Fast Enumeration
3つめに紹介するのは、速い繰り返し構文だ。Cocoaでは、従来はNSEnumeratorというプロトコルを使って繰り返し構文を記述できた。これの改良として、NSFastEnumerationが導入された。名前の通り、より速いenumerationになる。
速さには、2つある。1つは、コーディングの速さだ。NSFastEnumerationを使うために文法が拡張され、次のようなコーディングが可能になった。
NSArray* array = [NSArray arrayWithObjects:@"Leopard", @"Cocoa", @"Objective-C 2.0", nil];
for (NSString* string in array) {
NSLog(@"string is %@", string);
}
NSFastEnumerationの変数を宣言する必要はなく、for文の中で宣言した一時変数を使ってアクセス可能である。従来のものと比べると、ぐっとコーディング量が減った。
もう1つの速さは、実行速度である。NSFastEnumerationは、NSEnumeratorと比べて、実行速度は速くなるらしい。その秘密は、実装されるメソッドの違いにある。NSEnumeratorでは、nextObjectというメソッドが必要だったが、NSFastEnumerationでは、次のメソッドになる。
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState*)state objects:(id*)stackbuf count:(NSUInteger)len
これらの引数を使って、より効率的な実装が可能となった。