Вопрос

Единственное подчеркивание в 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;
}

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

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

Это было полезно?

Решение

Ни компилятор C, ни компилятор Objective-C не обрабатывают имена переменных с начальными символами подчеркивания иначе, чем любое другое имя переменной.Одинарное или двойное начальное подчеркивание - это просто конвенция и эффективно формирует пространство имен, очень похожее на NS префикс , используемый в классах Cocoa, таких как 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 традиционно использовала единственный префикс подчеркивания для обозначения частной переменной экземпляра (распространенный стиль в объектно-ориентированных языках).Это было воспринято как подразумевающее, что каждый должен префиксить свои ivars символами подчеркивания, пока Apple не указала, что использование символа подчеркивания в вашем коде может создать конфликты с Cocoa, если Apple решит изменить их заголовки, и, возможно, вам не следует этого делать.Таким образом, префиксы подчеркивания стали "не рекомендуемой" практикой кодирования.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top