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

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

  • Сериализация и десериализация объектов Objective-C в JSON
  • Могу ли я отключить прокрутку звука UIPickerView?
  • Objective-c iPhone-процент кодирует строку?
  • Программно включить Bluetooth в iphone sdk?
  • Чтение образцов с помощью AVAssetReader
  • Свойство запроса Parse NSURL
  • Что такое хорошо для?
  • Что именно делает делегат в проекте xcode ios?
  • Есть ли какие-либо frameworks для выделения текста в pdf-файле после рендеринга на iphone
  • как создать круглую кнопку?
  • NSMutableArray - заставить массив удерживать только определенный тип объекта
  • Давайте будем гением компьютера.