В первом случае компилятор уже добавляет по умолчанию @synthesize var=_var;
так что вы можете пропустить его. Это Clang extension
Clang обеспечивает поддержку автосинтеза заявленных свойств. Используя эту функцию , лязг обеспечивает синтез этих свойств не заявленных @dynamic и не имея при условии, подкладочный пользователя геттера и методы инкубационных по умолчанию.
Во втором случае вы используете ivar и свойство с тем же именем. Это обычно будет выдавать предупреждение компилятора:
предупреждения: Autosynthesized свойства «loginDataManager» будет использовать синтезированный экземпляр переменного «_loginDataManager», не существующий экземпляр переменной «loginDataManager».
Но вы добавили @synthesize loginDataManager
, чтобы избежать предупреждения.
Отвечая на Ваш вопрос,
- Там нет никакой разницы между использованием @property или нет, кроме того, не в состоянии определить атрибуты (сильные, слабые, ...) в заявлении @property.
- Доступ к ивару напрямую позволяет избежать прохождения геттеров/сеттеров. Это хорошо, если вы пишете конструктор и хотите избежать побочных эффектов во время инициализации объекта. И обычно это плохо, потому что программа может полагаться на аксессуар для выполнения KVO/KVC или других действий. Но это выбор, если вы пишете код самостоятельно, и знаете, что делают аксессоры.
обновление
Если вы используете ARC (вы должны) объекты по умолчанию сохраняются сильные во время их объема использования. Значение, ARC обрабатывает сохранить/релиз автоматически, и нет никакой разницы между написанием какой-либо из следующих действий:
@property(strong) NSObject *o;
__strong NSObject *o;
NSObject *o;
Кроме того, нет никакой разницы, как получить доступ к ли вы с self.o
или _o
или o
. Это точно так же.
Но если вы используете чужой код и этот человек написал что-то еще в методе доступа, вам нужно написать self.o
для запуска этого кода. Таким образом, в общем случае, self.ivar предпочтителен при обращении к переменной вне конструктора:
-(NSObject*) o {
/* ... some other code that needs to run when you access o */
return o;
}
Если вы не используете ARC, то вам нужно написать self.ivar для того, чтобы аксессор правильно сохранить и освободить объект. Современные проекты, созданные последним Xcode, используют ARC по умолчанию.
Извините, этот вопрос только начнется. -1 – borrrden
Я бы сказал, что третий подход является лучшим: просто объявите свойство и оставьте заявление ivar и утверждение '@ synhesize'. Все остальное в основном просто повторяется. – mrueg
Вы должны прочитать их один раз http://www.danandcheryl.com/2012/08/3-tips-on-auto-synthesized-properties и http://useyourloaf.com/blog/2012/08/01/property- sync-with-xcode-4-dot-4.html –