2012-06-14 4 views
3

Можно создать дубликат:
Prefixing property names with an underscore in Objective CСложные свойства Objective-C: зачем использовать «подчеркнутое» фоновое поле?

При просмотре в учебник Objective-C, инструктор (который, казалось, очень хорошо осведомлены) говорит, что @synthesize свойства, должен быть присвоен "подчеркнул" поддержку поле, например:

`Person.h:` 
@interface Person : NSObject 

@property (nonatomic, strong) NSString firstName; 
@property (nonatomic, strong) NSString lastName; 

@end 


`Person.m` 

@implementation Person 

//This works: 
@synthesize firstName; 

//But I'm told this is a best practice.... why? 
@synthesize lastName = _lastName; 

@end 

Есть ли причина для этого?

+0

Есть *** много *** дубликатов этого вопроса. Вы, очевидно, даже не потрудились _trying_ искать. –

+2

http: // stackoverflow.ком/кв/6146244/ http://stackoverflow.com/q/10651535/ http://stackoverflow.com/q/6124109/ http://stackoverflow.com/q/8145373/ HTTP: // stackoverflow.com/q/3521254/ http://stackoverflow.com/q/2114587/ http://stackoverflow.com/q/6064283/ http://stackoverflow.com/q/9696359/ –

ответ

3

Это так, что вы не путаете имущество с его поддерживающим ivar. Кроме того, он также гарантирует, что переменная с передачей (для инициализатора или пользовательского геттера/сеттера или других функций) не мешает/не переопределяет имя/область поддержки ivar.

Пример:

- (void)setMyValue:(int)myValue 
{ 
    _myValue = myValue 
} 

Кроме того, подчеркивание конвенции широко знать, чтобы указать для внутреннего использования только для этой переменной. Чтобы привести рекомендации по яблоку:

Убедитесь, что имя переменной экземпляра кратко описывает атрибут . Обычно вам не нужно напрямую обращаться к переменным экземпляра , вместо этого вы должны использовать методы доступа (вы получаете доступ к переменным экземпляра непосредственно в методах init и dealloc). Чтобы помочь сигнала, это имена переменных экземпляра префикс подчеркивания (_), , например:

1

Это предотвращает вас от использования Ивар непосредственно вместо метода геттер/сеттер.

В противном случае вы можете случайно смешать self.myVar и myVar в других функциях, которые совпадают с обычным синтезом, но позже не будут получать доступ к вашему методу getter/setter.

Используя @synthesize myVar = _myVar;, вы получите сообщение об ошибке, если вы используете только myVar.

1

Основная причина этого в том, что, когда вы получаете доступ к ivar непосредственно из вашей реализации класса, вам нужно использовать подчеркивание в начале. Это гарантирует, что вы сознательно сделаете выбор для доступа к нему напрямую, вместо использования метода доступа. В тех случаях, когда переменная является лениво загруженной или имеет некоторые другие побочные эффекты, это важно, и выбор правильного пути доступа к переменной может спасти вас от сложных ошибок.

1

В дополнение к CrimsonDiego,

В таких языках, как Java вы были написать свои собственные геттеры & сеттеры, вы бы просто ссылаться на this или self. В Objective-C они синтезируются для вас, когда вы ссылаетесь на ivar, используя знак подчеркивания _, вы знаете, что вы просто прямо устанавливаете/получаете его. Когда я использую self.ivar, я знаю, что создал пользовательский getter/setter.

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