プロパティ

次に、プロパテイを見てみよう。プロパティは、インスタンス変数に便利にアクセス出来るようにする記法だ。

従来のObjective-Cでは、あるオブジェクトのインスタンス変数にアクセスするには、先ほど紹介したような、アクセッサメソッドを実装するのが通例だった。このスタイルの問題点は、決まりきったコードを何度も書かなくてはいけないこと、そのくせコピーやスレッドセーフのことを考慮して慎重なコーディングが求められることにある。早い話、みんなうんざりしていた訳だ。

これらを解決してくれるのが、プロパティだ。これは、見てもらうのが早いだろう。まず、プロパティを実装してみよう。

@interface MyObject : NSObject
{
    NSString* _name;
}
@property (assign) NSString* name;

@implementation
@synthesize name;
@end

クラスの宣言部にある、@propertyがプロパティの宣言だ。ここでは、nameという名前のプロパティを宣言している。注意してほしいのは、同時に_nameという名前のインスタンス変数もあるところだ。プロパティの宣言自体は実装を持たないので、別途確保してやる必要がある。

クラスの実装部には、@synthesizeという記述がある。これは、プロパティnameのためのアクセッサを、コンパイラが自動的に作るように指示している。これ以外に、自分でアクセッサを実装することもできる。

これで、プロパティの準備は完了だ。プロパティにアクセスするには、次のようなコーディングを行う。

    MyObject* object = [[MyObject alloc] init];
    object.name = @"Steve";

インスタンス変数とプロパティを、「ドット」でつなぐ記法である。JavaやC#で見られる記法に近くなった。Objective-Cでは、[]でメッセージ送信を行うというのが原則であったが、それが崩れたことになる。

ドット記法の採用には、様々な是非があるだろう。もともと構造体のアクセスでも使われていたので、違和感が無い方もあるだろう。だが、プロパティのアクセスではメッセージ送信が発生するので、[]によるものとの間で統一性がとれないという見方も出来る。

個人的には、単純にコーディング量が減ったという点で、歓迎したい。実際、プロパティを使ったコーディングには、あっという間に慣れてしまった。Leopardで新たに導入されたフレームワークで、プロパティを多用しているのも一因だろうか。