Нужно объяснение в @property/@синтезироваться в iOS
Не полный noob. Я новичок в программировании iOS и Ojbective-C. В основном я использую C (DSP, Microcontrollers), Delphi XE2/Pascal, Visual Basic и Java (настольные и Android-приложения).
В основном я узнал Cocoa с книгой "Начало разработки iOS 5" от Apress.
Недавно я просмотрел видеоролики WWDC 2012 и просмотрел некоторые из своих примеров кода, и я должен сказать, что я смущен тем, что является правильным способом написания моих приложений и, более конкретно, с помощью слов @property/@synhesize.
В книге большинство (не сказать все) примерного кода используют для определения свойства, например,
ViewController.h
@property (strong, nonatomic) NSMutableArray *list;
ViewController.m
@synthesize list;
то весь список синтезов кода доступа с
self.list
или даже просто
list
Теперь в каждом примере кода WWDC, который я прочитал, я вижу, что программисты определяют свойство, но затем в файле .m они делают такие вещи, как
@synthesize list = _list;
и иногда доступ
self.list
или
_list
Я смущен. Какова правильная практика? Поскольку программисты Apple все используют подчеркивание, я думаю, что я должен сделать это именно так, но почему книга не сделала этого? Есть ли разница между списком и _list? И более того, поскольку я нахожусь в одном и том же объекте, почему когда-то используют self.list, а иногда list/_list.
Иногда они не используют @synthesize, я предполагаю это, когда они хотят переписать свои собственные аксессоры и мутаторы (что никогда не бывает до сих пор).
Я читал здесь и там в Интернете, но ничего не было достаточно ясно, чтобы правильно настроить мой разум, поэтому я рассчитываю, что StackOverflow принесет свет здесь.
И последнее, но не менее важное, я предпочитаю и отвечаю на основе текущей практики IOS 6/практики. Бесполезно говорить мне, как правильно это сделать в более ранних версиях iOS.
Ответы
Ответ 1
Нет правильного пути. Существует только ваш предпочтительный стиль.
Последние компиляторы делают неявный синтез объявления свойства.
@synthesize list = _list;
.
В вашем коде ничего не написано. Это просто происходит.
Однако это не помешает вам сделать это явно.
@synthesize list = somethingelse;
Итак, когда вы запрашиваете указатель на list
через accessor (self.list
), вы получите указатель на somethingelse
В большинстве случаев NSMutableArray *thing = self.list
эквивалентно NSMutableArray *thing = somethingelse
И только потому, что Apple использует стиль, это не значит, что вам нужно это делать. Каждая компания обычно имеет свой собственный стиль кодирования.
Основная проблема с использованием @synthesize list;
заключается в том, что он создает риск того, что вы можете написать либо
self.list = thing
или list = thing
.
Первый использует sythesised setList:
accessor, в то время как последний не делает этого, и подвергает опасности связанные ошибки в вашем коде, хотя это не так плохо с ARC
, поскольку вы не получаете утечек, происходящих для свойств strong
.
Какой стиль вы используете, держите его согласованным и отдавайте себе отчет в эффектах использования ivar непосредственно list = thing
по сравнению с использованием его аксессора self.list = thing
Ответ 2
Это языковая функция, которая за последние несколько лет быстро развивается, что объясняет различные формы. Используя самые последние инструменты, вы можете игнорировать @synthesize
и работать нормально.
Поведение по умолчанию в этом случае производит тот же эффект, что и @synthesize list = _list;
.