Что это за двойное подчеркивание в какао?

Единственное подчеркивание в Objective-C, по-видимому, зарезервировано для "внутреннего" использования Apple (и было доступно для использования с частными переменными экземпляра до заявления Apple). Но зачем им использовать двойной знак подчеркивания в примере с SQLiteBooks для iPhone? Посмотрите этот фрагмент, взятый из MasterViewController.m:

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

На этом форуме есть упоминание о двойном подчеркивании, так как оно относится к Си - для внутреннего использования компилятора. Я думаю, я не понимаю, как это применимо в этой ситуации.

Мне нужен ViewController в моем приложении, который будет вести себя так же, как в примере проекта SQLiteBooks, но это двойное подчеркивание поставило меня в тупик.

4 ответа

Решение

Ни компилятор C, ни компилятор Objective-C не обрабатывают имена переменных с начальными подчеркиваниями иначе, чем любые другие имена переменных. Одинарное или двойное начальное подчеркивание - это просто соглашение и эффективно образует пространство имен, очень похожее на NS Префикс, используемый в классах Какао, таких как NSString,

Глядя на код SQLiteBooks, MasterViewController.m определяет эту статическую глобальную переменную:

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

Таким образом, я предполагаю, что автор SQLiteBooks использует двойное нижнее подчеркивание для обозначения глобальной переменной.

Компиляторы C (и расширение Objective-C) резервируют имена, начинающиеся с двух подчеркиваний и заглавной буквы, для использования поставщиком компилятора, предоставляя им зарезервированное пространство имен для использования для глобальных переменных и функций, используемых для реализации стандартных библиотек, или для введения новых Стандартные ключевые слова, такие как __block,

Хотя код SQLiteBooks технически допустим, на мой взгляд, его слишком легко спутать с зарезервированным пространством имен. Если вы повторно используете этот код, я бы порекомендовал переименовать эту переменную (Xcode имеет очень хороший рефакторинг переименования, который сделает это автоматически за вас).

Для компилятора подчеркивания обрабатываются как любой алфавитный символ. Хотя в целом подчеркивания обычно используются языковыми расширениями или большими библиотеками, чтобы избежать конфликтов с пользовательским кодом.

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

Apple традиционно использует один префикс подчеркивания для обозначения частной переменной экземпляра (общий стиль в объектно-ориентированных языках). Это было сделано для того, чтобы подразумевать, что каждый должен ставить префикс своих иваров с подчеркиванием до тех пор, пока Apple не укажет, что использование подчеркивания в вашем коде может создать конфликты с Какао, если Apple решит изменить свои заголовки, а может быть, и нет. Таким образом, префиксы подчеркивания стали "не рекомендуемой" практикой кодирования.

В C и C производных языках любое слово с двойным подчеркиванием перед и после является нестандартным расширением языка. Смотрите расширения Apple, такие как __attribute__

Конечные подчеркивания часто добавляются в виде искаженных версий имен оригинальных имен компилятором или отладчиком (особенно, когда компилятор является многопроходным), и их обычно избегают, чтобы эти имена оставались четко отличными от оригиналов. Google суффикс их локальных переменных экземпляра Objective-C с подчеркиванием, чтобы избежать конфликтов с подчеркиванием Apple.

Мой совет: не используйте подчеркивания. Вы не должны использовать локальные переменные с тем же именем, что и переменные экземпляра (это просто сбивает с толку). Единственный потенциальный конфликт - между параметрами в методах установки и соответствующими переменными экземпляра - и вам, вероятно, следует поставить перед параметром префикс "a", "new" (или аналогичный) в нижнем регистре, поскольку это ясно указывает на то, что параметр является входящими значениями. но это еще не "значение".

Это просто соглашение по именованию переменных. Это ничего не делает. Авторы программ могут напомнить себе: "Это частная переменная".

Поставщики компиляторов / библиотек нередко обозначают определенные префиксы / постфиксы как "зарезервированные" для них. Это в значительной степени позволяет избежать непреднамеренных конфликтов между типами / определениями / наследуемыми переменными.

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

Что касается того, почему в примере кода используется этот стиль - первоначальный автор использовал тот же стиль кодирования, который он, вероятно, использует в своей повседневной работе, и потенциальный конфликт никогда не выделялся.

Вы должны хорошо сохранить пример кода как есть, но если вам неудобно, вы можете переименовать переменную.

Другие вопросы по тегам