В старые добрые времена, предшествовавшие 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: сохранит свое новое значение и что это свойство небезопасно использовать (для установки или get) в многопоточном режиме. окружение (без какого-либо другого механизма блокировки).