Objective-C: объявление свойства без реализации (@synthesize) - PullRequest
8 голосов
/ 21 сентября 2011

Насколько я понимаю, @property объявляет метод получения и установки в файле .h, а @synthesize реализует метод получения и установки в файлах .m.Кроме того, вместо написания @ synthesize можно написать собственную реализацию для метода получения и установки.

Итак, если нам всегда нужно реализовать средство установки / получения, почему нам нужно дополнительно объявить это?@property кажется семантическим излишним для меня и источником ошибок.

Что происходит, когда я объявляю @property, но забываю реализовать его с помощью @synthesize или вручную?Что происходит, когда я использую @synthesize и забываю объявление @property?

Ответы [ 4 ]

26 голосов
/ 08 августа 2012

Свойства теперь синтезируются по умолчанию, начиная с Xcode 4.4, так что да, вы правы, это было избыточно, и Apple избавила от необходимости писать и @property, и @synthesize, просто используйте @property с этого момента.

6 голосов
/ 21 сентября 2011

ниже в файле .h

@property (retain, nonatomic) NSString* userName;

является синтаксическим сахаром для

-(NSString*)userName;

-(void)setUserName:(NSString*)userName;

в файле .h

и @synthesize in .m - это синтаксический сахар для оставления для собственной реализации, уважая ваши retain, nonatomic и т. Д., Как указано в объявлении вашего свойства.

Вы не можете синтезировать без @property, даже если вы указали подходящий метод get, сигнатуру set в файле .h.

Но вы можете оставить @synthesize и реализовать свой собственный метод получения и установки.

Если вы выполнили как @synthesize, так и пользовательский установщик получения, среда выполнения уважает вашу реализацию и вызывает то же самое.

4 голосов
/ 21 сентября 2011

Что происходит, когда я объявляю @property, но забываю реализовать его с @synthesize или вручную? Что происходит, когда я использую @synthesize и забыть объявление @property?

Почему бы вам не попробовать это? Если вы забудете синтезировать методы доступа или предоставить свои собственные, компилятор предупредит вас. (И если он настроен на обработку предупреждений как ошибок, что является хорошей идеей, невозможно пропустить предупреждение.) Второй случай обычно приводит к ошибке компиляции.

Так что, если нам всегда нужно реализовать метод установки / получения, зачем нам дополнительно объявить это? @property кажется семантически избыточным для я и источник ошибок.

Проще говоря, @property - это объявление свойства, а @synthesize - одна из возможных реализаций. Один принадлежит заголовку (= описание открытого интерфейса), другой - файлу реализации. Как бы ты это сделал, если бы не так?

2 голосов
/ 21 сентября 2011

Просто хотел добавить, что вы также можете использовать @dynamic вместо @synthesize, хотя это очень редко нужно делать.@dynamic в основном говорит компилятору, что вы каким-то образом собираетесь убедиться, что вызовы геттеров и сеттеров будут обработаны во время выполнения, либо сделав их самостоятельно, либо выполнив некоторые дополнительные действия.вокруг с некоторыми из особенностей времени выполнения Objective C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...