Синтезированное свойство и переменная с префиксом подчеркивания: что это значит?
Возможный дубликат:
Подчеркнуть префикс имени свойства?
Что это значит? @synthesize window=_window;
Я знаю, что в целом это означает, что "некоторый класс" имеет окно, но зачем использовать _window
вместо просто window
? Является ли это пространством имен?
Ответы
Ответ 1
Я расскажу об этом соглашении по программированию на основном английском языке.
Это очень распространенное соглашение на других языках, чтобы назвать переменные-члены с предшествующими m
, m_
или _
, чтобы отличить их от локально объявленных переменных и означать, что они должны иметь письменные записи, если необходимо (нет classInstance.m_Variable = 5
).
Если программист Objective-C объявляет ivars после этого соглашения (и они должны) и использует базовый синтаксис @synthesize _window;
, то использование для свойства становится несколько уродливым: classInstance._window = myWindow
или [classInstance set_window:myWindow]
. Использование синтаксиса @synthesize window=_window;
позволяет программисту Obj-C использовать популярный стандарт программирования (предшествующие ivars с _
), одновременно имея атрибуты свойств, которые используют стандарт Apple classInstance.window = myWindow
и [classInstance setWindow:myWindow]
.
Ответ 2
Это очень распространенная вещь, которую нужно сделать в программировании iOS/ objective-C, это связано с иварами. Для получения дополнительной информации вы можете прочитать здесь:
Почему переименовать синтезированные свойства в iOS с лидирующими символами подчеркивания?
Как подчеркивается символ подчеркивания перед переменной в классе cocoa objective-c?
Основываясь на моем опыте использования этой привычки в моем коде, он помогает мне случайно писать окно, когда вы имеете в виду self.window и наоборот (не обязательно должно быть окно, но любые другие переменные)
Ответ 3
короткий ответ: подчеркивание - это просто соглашение, полезно подчеркнуть тот факт, что переменные класса "private" для класса, и вы должны получить к ним доступ через свои свойства.
вы можете объявить свою переменную window
без предварительного подчеркивания; в этом случае оператор @synthetize будет просто: @synthetize window
, и он будет практически таким же.
для длинного ответа, ссылки, размещенные aherlambang, действительно интересны для чтения...