В каких случаях необходимо использовать synthesize?

Рейтинг: 11Ответов: 2Опубликовано: 27.01.2011

Не могли бы объяснить простыми словами, в каких ситуациях необходим synthesize? Я так понял, он дает возможность обращаться к проперти через get- и set-. Получается, что проперти без synthesize ничем не отличается от переменной класса? И имеет ли тогда вообще смысл писать пропети без synthesize?

Ответы

▲ 17Принят

Свойства (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).

▲ 4

Из вопроса «Objective-C is @synthesize required or optional?»:

No we don't need to do that as of Xcode 4.4, which added a feature called Default Synthesis Of Properties.

Simply put, it generates this automatically:

@synthesize name = _name;

Короче, можно не париться: начиная с Xcode 4.4, IDE сама дефолтом устанавливает @synthesize name = _name; везде, где это требуется.