Свойства (property) появились в Objective-C только в версии 2.0 и они сводятся к обычным методам (или сообщениям, если угодно). То есть если вы объявляете свойство
@property (nonatomic, retain) NSString* property1;
то на самом деле вы объявляете такие геттер и сеттер:
-(NSString*)property1;
-(void)setProperty1:(NSString*)value;
Когда вы используете свойство
NSString* p = v.property1;
v.property1 = p;
на самом деле компилятор «разворачивает» это в такой код:
NSString* p = [v property1];
[v setProperty1:p];
Оператор @synthesize property1;
разворачивается в определения кода для сеттера и геттера (в соответствии с параметрами, которые вы указали в объявлении свойства).
Вы можете и не писать @synthesize
, однако в этом случае вам придется самому написать реализации геттера и сеттера. Если вы не сделаете ни того, ни другого, компилятор выдаст предупреждение, а код, который использует свойство, будет вылетать.
Так как @property
разворачивается в объявления сеттера и геттера, его нужно писать в интерфейсе класса (обычно в файле заголовков - .h). Аналогично, @synthesize
«генерирует» реализации сеттера и геттера, поэтому используется в файле реализации (.m, .mm).