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

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

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

id _dataSource; 

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

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

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

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

 @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 имени, это то, что представляют эти функции.

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

может ли это быть … (бег трусцой памяти) …

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

| K <

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

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

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

  • запись NSDictionary для plist в моем приложении
  • Ссылка с UITableViewCell на родительский UITableView?
  • Как добавить 1 день к NSDate?
  • как отобразить тестовый баннер IAd в симуляторе
  • Округлые углы только на вершине UIView
  • Можно ли изменить цвет фона UIButtons?
  • Что такое хорошо для?
  • Как вы вычисляете день года на определенную дату в Objective-C?
  • Держите iphone активным во время запуска программы
  • Выясните, кадр UIBarButtonItem в окне?
  • Выполнение команд оболочки с помощью NSTask - Objective-C Cocoa
  • Interesting Posts

    В MacBook с двойной загрузкой, используя BootCamp, переместил жесткий диск в оптический отсек, и Windows больше не загружается

    Как получить дату и время клиента в ASP.NET?

    Добавьте разрыв строки в ‘git commit -m’ из командной строки

    Может ли Google Chrome узнать, как быстро я печатаю?

    Как указать дополнительные внешние папки хранения (точки подключения)?

    Сингулярные или множественные имена controllerов и помощников в Rails

    Отключить ключ ускорителя ярлыков WPF (текст подчеркивания отсутствует)

    Не является ли аргумент шаблона (подпись) части std :: function его типа?

    компонент java swing не может быть разрешен

    Кластеризация кластеров с помощью Google Maps SDK для iOS?

    Что такое MVP и MVC и в чем разница?

    Тайм-аут при запуске тестов xcodebuild под Xcode 6 через SSH

    Изменение размера шрифта на основе шрифта-семейства с помощью jQuery

    Лучший способ организовать много-много медиа-файлов?

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

    Давайте будем гением компьютера.