Зачем подчеркивать "_" перед именами переменных в Objective C

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

В объекте C я вижу много кода с подчеркиванием перед именами переменных, например _someVariable

почему? также как вам писать аксессоры i.e get и set для такой переменной.

Ответы

Ответ 1

Символы подчеркивания часто используются, чтобы показать, что переменные являются переменными экземпляра. Это не обязательно, так как ivars могут иметь то же имя, что и их свойства и их аксессоры.

Пример:

@interface MyClass : NSObject {
    NSString *_myIVar;                  // can be omitted, see rest of text
}
// accessors, first one is getter, second one is setter
- (NSString *) myIVar;                  // can be omitted, see rest of text
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text

// other methods

@property (nonatomic, copy) NSString *myIVar;

@end

Теперь вместо того, чтобы объявлять и кодировать аксессоров myIVar и setMyIVar: самостоятельно, вы можете позволить компилятору сделать это. В новых версиях вам даже не нужно объявлять myIVar в интерфейсе. Вы просто объявляете свойство и позволяете компилятору синтезировать остальное для вас. В файле .m выполните следующие действия:

@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you, 
                    // with proper code.
                    // also generates the instance variable myIVar

// etc...

@end

Обязательно завершите строку:

- (void) dealloc {
    [myIVar release]; 
    [super dealloc];
}

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

Доступ к свойствам осуществляется как

myString = self.myIVar;

или из другого класса:

theString = otherClass.myIVar;

и

otherClass.myIVar = @"Hello, world!";

В MyClass, если вы опустите self., вы получите голый ivar. Обычно это должно использоваться только в инициализаторах и в dealloc.

Ответ 2

Не делай этого.

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

Ответ 3

это соглашение об именах, обычно используемое для С++ для определения переменной экземпляра, которая является частной

как в классе u, может иметь

private:
int __x;

public:
int GetX()
{
  return this.__x;
}

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