Что означают префиксные имена переменных в Objective-C? - PullRequest
2 голосов
/ 04 октября 2010

Я заметил, что во многих классах Objective-C сообщества и в средах Apple они называют некоторые переменные, используя соглашение, которое ставит префикс перед символами подчеркивания, например: _name.Что является причиной того, что подчеркивание.Должен ли я делать это в моих собственных классах?Если так, где и когда я должен использовать это?

Ответы [ 3 ]

8 голосов
/ 04 октября 2010

Это называется углификацией. Дело в том, что вы никогда не используете его, поэтому никакое имя переменной или #define, которое вы создаете, не может помешать коду Apple.

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

Из C99 7.1.3 «Зарезервированные идентификаторы»:

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

(Они зарезервированы для системной библиотеки.)

Примечание. Я не уверен в точных отношениях между C99 и Apple ObjC, но у вас также могут быть соглашения об именах, которые работают во всем семействе языков C. В частности, для ObjC ++ потребуются допустимые имена C ++, для которых требуется дополнительное условие: ни одного двойного подчеркивания нигде.

4 голосов
/ 04 октября 2010

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

Имена методов, начинающиеся с «_», одного символа подчеркивания, зарезервированы для использования Apple.

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

2 голосов
/ 26 октября 2010

Подчеркивания мешают удобочитаемости. Также с LLVM вместо GCC я избавляюсь от ivars на стороне заголовка и использую свойства стороны заголовка. Обязательно сделайте ваши свойства не атомарными, если вы действительно не хотите синхронизировать чтение и запись для обеспечения безопасности потоков. если вы не укажете non atomic, по умолчанию будет использоваться atomic - что лишит вас некоторой производительности.

также по соглашению, никогда не запускайте методы доступа с помощью get. setters Должен начинаться с set, но не с get. Читайте о KVO и KVC, чтобы узнать больше о конвенциях и для чего они хороши.

Однако мне нравится подчеркивание в списке именования перечисления. Здесь подчеркивание помогает мне выбрать суффикс из 5 или более строк, начинающихся с одного и того же стебля. подобно typedef NSInteger COMPASS_DIRECTION; enum { COMPASS_DIRECTION_NORTH, COMPASS_DIRECTION_EAST, COMPASS_DIRECTION_SOUTH, COMPASS_DIRECTION_WEST, };

...