Возможный дубликат:
Как делает подчеркивание перед переменной в работе класса цели-c какао?Я заметил, что в большом количестве ссылочных материалов там, вижу, что много времени, переменные называют _variable в.h файле, затем являются @synthesize'd в.m файле как
@synthesize variable = _variable;
Почему это сделано? Что я пропускаю?
Спасибо!
На этом нет консенсуса. Некоторые люди любят использовать его для ясности для отделения переменных классов, и, как отметил другой респонденты, чтобы избежать конфликта с именами входящих параметров. Даже в Apple Code Code используется использование смешивается.
Однако я очень предпочитаю не использовать префикс _ [11345556] _
и иметь два сильных причина:
1) Некоторые люди думают, что _
- хороший показатель «частного» Отказ Мой взять в том, что ни один класс локальной переменной не должен быть доступен без установки / Getter (свойство) и, таким образом, все они являются частными - учитывая, почему не назвать их в течение проще читать и использовать автозаполнение? Любые перекрытия в именах из параметров быстро выявлены компилятором и избегают более заботливого именования параметров (или внутренних переменных).
2) (даже лучшая причина) - если вы используете «Refactor» в XCode на внутреннем классе VAR, который называется, то же самое, что и свойство, используемое для доступа к нему, свойство и Synthesize оператора также будет переименоваться. Если вы используете Refactor на переменную класса, префиксную с помощью _
, имя свойства не будет изменено - просто синтезировать отображение на внутреннем имени. Я почти никогда не хочу, чтобы имя варьироваться от собственности на реальную переменную, к которой он предоставляет доступ. Только это заставляет меня никогда не хотеть использовать _
как префикс переменной, поскольку возможность смещения имени - это только самое полезное, что вы можете сделать, чтобы улучшить четкость кода.
Использование того, что синтаксис - это вариант, чтобы сделать более понятно, что ивар и свойство разные вещи.
Чтобы кодировать внешний к классу, нет никакой разницы, поскольку он использует свойство.
Для кода в реализации самого класса он может сделать его более понятно, когда используется IVAR, по сравнению с имуществом.
Например, скажем, у нас есть ивар / недвижимость для объекта NSNUMBER:
@interface MyClass : NSObject {
NSNumber *num;
}
@property (nonatomic, retain) NSNumber *num;
- (void)doSomething;
@end
@implementation MyClass
@synthesize num;
- (void)doSomething {
// set the property, num is properly retained
self.num = [NSNumber numberWithInteger:1];
// accidentally set the ivar, num is NOT retained
num = [NSNumber numberWithInteger:2];
}
@end
и теперь используя другое имя для Ивара и свойства:
@interface MyClass : NSObject {
NSNumber *i_num;
}
@property (nonatomic, retain) NSNumber *num;
- (void)doSomething;
@end
@implementation MyClass
@synthesize num = i_num;
- (void)doSomething {
// set the property, num is properly retained
self.num = [NSNumber numberWithInteger:1];
// compiler error, there is no ivar named "num"
num = [NSNumber numberWithInteger:2];
// set the ivar, so it needs to be a retained object
i_num = [[NSNumber alloc] initWithInteger:3];
}
@end
Иногда люди используют Mvarname (C ++), а в Obj-C стиль, кажется, _warkame. Одна проблема. упомянуть свое запутанное.
М, _, все, что помогает показать, какие свойства члена класса.
-(void) set:(int)x
{
x = x; // x is an ivar! heh
}
VS
-(void) set:(int)x
{
_x = x; // ahh I see!
}
Это чисто конвенция. Я полагаю, что это общие, потому что когда вы делаете метод Getter Call, как это:
[myObject variable]
Вы на самом деле вызываете метод, не доступа к переменной напрямую. _ Front позволяет понять, что вы говорите о переменной. Лично я нахожу этот синтаксис, раздражающий и отвлекающуюся. Я нахожу это ненужным, но вы правы, оно появляется здесь и там.