プロパティ

文法として拡張されたのは、プロパティだ。プロパティは、クラスのインスタンスに付け加える属性で、手早くアクセスできる。

例を紹介しよう。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

これらの引数を使って、より効率的な実装が可能となった。