Я видел в нескольких примерах iPhone, что атрибуты используют подчеркивание _ перед переменной. Кто-нибудь знает что это значит? Или как это работает?
Файл интерфейса, который я использую, выглядит следующим образом:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Я не уверен точно, что делает вышеупомянутое, но когда я пытаюсь установить название миссии как:
aMission.missionName = missionName;
Я получаю ошибку:
запрос на членство 'missionName' в чем-то, что не является структурой или объединением
property
в файле .h и в файле .m fie доступ к немуself
следующим образомself.someProperty
. Это правильный путь? Или я должен использовать ivars в коде?Это просто соглашение по удобочитаемости, оно не делает ничего особенного для компилятора. Вы увидите, как люди используют его для личных переменных экземпляра и имен методов. Apple фактически рекомендует не использовать подчеркивание (если вы не будете осторожны, вы можете переопределить что-то в своем суперклассе), но вы не должны расстраиваться из-за игнорирования этого совета. :)
источник
Единственная полезная цель, которую я видел, состоит в том, чтобы различать локальные переменные и переменные-члены, как указано выше, но это не является необходимым соглашением. В сочетании с @property, это увеличивает многословность операторов синтеза -
@synthesize missionName = _missionName;
и везде безобразно.Вместо использования подчеркивания, просто используйте описательные имена переменных внутри методов, которые не конфликтуют. Когда они должны конфликтовать, имя переменной в методе должно иметь подчеркивание, а не переменную-член, которая может использоваться несколькими методами . Единственное общее место, где это полезно, находится в установщике или в методе init. Кроме того, это сделает оператор @synthesize более лаконичным.
Редактировать: с последней функцией компиляции автоматического синтеза, я теперь использую подчеркивание для ивара (в редких случаях, когда мне нужно использовать ивар, чтобы соответствовать тому, что делает автосинтез.
источник
На самом деле это ничего не значит, это просто соглашение, которое некоторые люди используют для дифференциации переменных-членов от локальных переменных.
Что касается ошибки, похоже, что aMission имеет неправильный тип. Каково это его объявление?
источник
Это только для соглашения об именовании свойств синтеза.
Когда вы синтезируете переменные в файле .m, Xcode автоматически предоставит вам _variable интеллект.
источник
Наличие подчеркивания не только позволяет разрешать ваши ивары, не прибегая к использованию синтаксиса self.member, но и делает ваш код более читабельным, поскольку вы знаете, когда переменная является иваром (из-за префикса подчеркивания) или аргументом-членом (без подчеркивания) ).
Пример:
источник
self.image
, который обращается к свойству. Единственный раз, когда вы должны обращаться к переменной экземпляра_image
напрямую, находится внутриinit
методов иdealloc
метода, когда вызов любого другого метода может быть рискованным (так как объект наполовину инициализирован или наполовину освобожден).Похоже, что это «главный» пункт для вопросов о self.variableName и _variablename. То, что бросило меня за петлю, было то, что в .h, у меня было:
Это приводит к тому, что self.variableName и _variableName являются двумя различными переменными в .m. Что мне нужно было:
Затем в классе '.m self.variableName и _variableName эквивалентны.
Что я до сих пор не понимаю, так это то, почему многие примеры все еще работают, даже если это не сделано.
луч
источник
вместо подчеркивания вы можете использовать имя self.variable или вы можете синтезировать переменную, чтобы использовать переменную или выход без подчеркивания.
источник
Из других ответов отсутствует то, что использование не
_variable
позволяет вам бездумно печататьvariable
и получать доступ к ivar, а не к (предположительно предполагаемому) свойству.Компилятор заставит вас использовать либо
self.variable
или_variable
. Использование подчеркивания делает невозможным ввод текстаvariable
, что уменьшает количество ошибок программиста.источник