Что это за двойное подчеркивание в какао? - PullRequest
6 голосов
/ 19 февраля 2009

Единственное подчеркивание в Objective-C, по-видимому, зарезервировано для «внутреннего» использования Apple (и было доступно для использования с частными переменными экземпляра до заявления Apple). Но почему они используют double -underscore в своем примере с 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;
}

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

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

Ответы [ 4 ]

20 голосов
/ 19 февраля 2009

Ни компилятор 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 имеет очень хороший рефакторинг переименования, который сделает это автоматически за вас).

6 голосов
/ 20 февраля 2009

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

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

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

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

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

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

2 голосов
/ 19 февраля 2009

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

0 голосов
/ 19 февраля 2009

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

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

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

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

...