Ответ 1
Многие используют это для частных переменных, чтобы различать частные переменные и общедоступные переменные внутри объекта.
Это совершенно необязательный способ работы.
Возможный дубликат:
Как подчеркивается символ подчеркивания перед переменной в классе cocoa objective-c?
Я видел это в Apple, внутри UIPickerView.h:
id<UIPickerViewDataSource> _dataSource;
зачем это подчеркивать? Это имеет особое значение? Конвенция, о которой я должен знать?
Многие используют это для частных переменных, чтобы различать частные переменные и общедоступные переменные внутри объекта.
Это совершенно необязательный способ работы.
То, что вы видите, - это использование подчеркиваний для различения переменных экземпляра и свойств. Таким образом, объявление класса может быть:
@interface Foo {
NSString* _label;
....
}
@property (nonatomic, retain) NSString* label; // notice: no underline
Затем в файле реализации вы должны:
@synthesize label=_label; // the property is matched with the ivar
Теперь, когда внутри реализации, если вы хотите получить доступ к переменной экземпляра напрямую, вы можете просто использовать _label
, но пройти через методы доступа к свойствам (которые заботятся о сохранении/выпуске и множестве других задач бухгалтерского учета ) вы использовали бы self.label
. С внешней стороны вы всегда захотите пройти через свойство {object}.label
.
Другой способ - без подчеркивания и просто использовать:
NSString* label;
@property (nonatomic, retain) NSString* label;
...
@synthesize label;
Он работает так же, но тогда он может смутить кого-то, читающего код, и попытаться отслеживать label
vs self.label
. Я лично считаю, что соглашение Apple (с подчеркиваниями) немного легче читать, но это вопрос предпочтения.
Как уже говорилось, уже было сказано, что переменная была частной. Это было простое соглашение и не имеет большого значения.
Другое использование, совершающее поездку в машине обратного пути в C a_function(), представляет собой функцию, которая не была переносимой платформой, а функция __function() представляла собой функцию, которая не была компилятором. Итак, в стандартной библиотеке C вы иногда увидите переменную с _ или __ infront имени, это то, что представляют эти функции.
Иногда он используется для обозначения частных переменных. В более общем смысле это просто означает, что "эта переменная каким-то образом отличается".
может быть, что... (пробежка)...
Я смутно помню, как читал документ АЦП, объясняющий, что яблоко резервирует использование переменных-префиксов-символов с символом подчеркивания? и что сторонним разработчикам не рекомендуется использовать это соглашение, чтобы избежать столкновений?
| К <
Я использую символы подчеркивания, чтобы обозначить, что переменная является членом, похожей на префикс 'm' в венгерской нотации (в которой я полностью презираю, но это другая история). Конечно, в наши дни вы получаете редакторов цветного кодирования, но, по моему мнению, префикс заставляет задуматься о том, что переменная является членом/экземпляром, прежде чем вводить ее, а не только после этого, когда цвет будет закодирован вашим редактором.
В общем случае это означает, что переменная не должна быть непосредственно затронута разработчиком. Это не действительно требование, но это хорошая практика, если вы не можете избежать наличия переменной public в классе, с которым вы не хотите общаться.
Я выбираю использовать подчеркивания для ivars, потому что часто сталкиваюсь со следующей ситуацией:
@interface MyClass:NSObject
{
NSUInteger count;
}
@property(nonatomic) NSUInteger count;
-(id) initWithCount(NSUInteger) count;
@end
(...)
@implementation MyClass
@synthesize count;
-(id) initWithCount(NSUInteger) count
{
if((self = [super init])){
self.count = count; // Parameter name collides with ivar name!
}
return self;
}
@end
Итак, я делаю это:
@interface MyClass:NSObject
{
NSUInteger _count;
}
@property(nonatomic) NSUInteger count;
-(id) initWithCount(NSUInteger) count;
@end
(...)
@implementation MyClass
@synthesize count = _count;
-(id) initWithCount(NSUInteger) count
{
if((self = [super init])){
_count = count; // No name collision
}
return self;
}
@end
Конечно, я мог бы альтернативно изменить имя параметра на "newCount" или "aCount" (я ненавижу этот). Я думаю, что это вопрос вкуса.