Objective-C 2.0 より前の古き良き時代には、インスタンス変数のゲッターとセッターを記述するのが一般的でした。
@interface Foo : NSObject
{
@private
id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end
@implementation Foo
// need dealloc to release foo too.
-(void) setFoo: (id) newFoo
{
[newFoo retain];
[foo release];
foo = newFoo;
}
-(id) foo
{
return foo;
}
@end
これは、シングル スレッド環境での話です。マルチスレッド アプリにはさらに多くのものが必要でした。
プロパティは、上記の簡潔な表現を提供します。@property は、インターフェース内の両方の宣言を置き換えるだけでなく、getter と setter のセマンティクスに関するより良いヒントを呼び出し元に提供します。また、アクセサーを @synthesize して、コンパイラーがそれらのコードを自動的に生成できるようにすることもできます (@synthesize する必要はありません。必要に応じて独自の実装を提供できます)。上記のすべてを置き換えることができます
@interface Foo : NSObject
{
@private
id foo;
}
@property (nonatomic, retain) id foo;
@end
@implementation Foo
// need dealloc to release foo too.
@synthesize foo;
@end
これにより入力の手間が大幅に省けますが、インタフェースから setFoo: が新しい値を保持し、マルチスレッド環境で (他のロック メカニズムなしで)プロパティを使用 (設定または取得) するのは安全ではないこともわかります。