Подтвердить что ты не робот

Нужно объяснение в @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.

4b9b3361

Ответ 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;.