2013-03-25 3 views
0

1) Является ли доступ к iVar прямо хорошим подходом?Доступ к iVariable напрямую - хороший подход в объективе C?

2) Какой лучший подход в следующем?

@interface Some 
@property (nonatomic, strong) NSString *loginDataManager; 
@end 

@implementation Some 
@synthesize loginDataManager = _loginDataManager; 
@end 


@interface Some { 
    NSString *loginDataManager; 
} 
@property (nonatomic, strong) NSString *loginDataManager; 
@end 

@implementation Some 
@synthesize loginDataManager; 
@end 
+2

Извините, этот вопрос только начнется. -1 – borrrden

+2

Я бы сказал, что третий подход является лучшим: просто объявите свойство и оставьте заявление ivar и утверждение '@ synhesize'. Все остальное в основном просто повторяется. – mrueg

+1

Вы должны прочитать их один раз 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 –

ответ

1

В первом случае компилятор уже добавляет по умолчанию @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 по умолчанию.

+0

если я вызываю self.loginDataManager и loginDataManager и _loginDataManager, в чем разница между ними? Доступ к iVar напрямую не хорош, после настройки свойства, чтобы избежать утечки памяти. Если мы позвоним, это лучше. Любое предложение, пожалуйста? –

+0

См. Обновление ответа. – Jano

+0

Если я объявляю переменную внутри интерфейса без какого-либо свойства, по умолчанию это будет считаться сильным? если это правильно, почему мы должны использовать сильное, неатомное и объявить свойство вручную? –

Смежные вопросы