Подтвердить что ты не робот

Когда вы делаете подчеркивание перед переменной экземпляра?

Возможный дубликат:
Как подчеркивается символ подчеркивания перед переменной в классе cocoa objective-c?

Я видел это в Apple, внутри UIPickerView.h:

id<UIPickerViewDataSource> _dataSource;

зачем это подчеркивать? Это имеет особое значение? Конвенция, о которой я должен знать?

4b9b3361

Ответ 1

Многие используют это для частных переменных, чтобы различать частные переменные и общедоступные переменные внутри объекта.

Это совершенно необязательный способ работы.

Ответ 2

То, что вы видите, - это использование подчеркиваний для различения переменных экземпляра и свойств. Таким образом, объявление класса может быть:

@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 (с подчеркиваниями) немного легче читать, но это вопрос предпочтения.

Ответ 3

Как уже говорилось, уже было сказано, что переменная была частной. Это было простое соглашение и не имеет большого значения.

Другое использование, совершающее поездку в машине обратного пути в C a_function(), представляет собой функцию, которая не была переносимой платформой, а функция __function() представляла собой функцию, которая не была компилятором. Итак, в стандартной библиотеке C вы иногда увидите переменную с _ или __ infront имени, это то, что представляют эти функции.

Ответ 4

Иногда он используется для обозначения частных переменных. В более общем смысле это просто означает, что "эта переменная каким-то образом отличается".

Ответ 5

может быть, что... (пробежка)...

Я смутно помню, как читал документ АЦП, объясняющий, что яблоко резервирует использование переменных-префиксов-символов с символом подчеркивания? и что сторонним разработчикам не рекомендуется использовать это соглашение, чтобы избежать столкновений?

| К <

Ответ 6

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

Ответ 7

В общем случае это означает, что переменная не должна быть непосредственно затронута разработчиком. Это не действительно требование, но это хорошая практика, если вы не можете избежать наличия переменной public в классе, с которым вы не хотите общаться.

Ответ 8

Я выбираю использовать подчеркивания для 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" (я ненавижу этот). Я думаю, что это вопрос вкуса.