Соглашение об именах в Objective C / C, начинаться с "_"? - PullRequest
5 голосов
/ 18 апреля 2010

Что-то, что я вижу, ppl определяет переменную следующим образом:

b2World *_world;
b2Body *_body;
CCSprite *_ball;

вместо

b2World *world;
b2Body *body;
CCSprite *ball;

Я знаком со вторым, но не с первым. Итак, я проверил Википедию о соглашении об именах:

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

Итак, это какое-то особое значение, начинающееся с "_"?

Код, который я видел, используя «_» для начала, находится здесь:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

Страница вики.

Ответы [ 5 ]

13 голосов
/ 18 апреля 2010

У некоторых разработчиков Objective-C существует давняя договоренность префиксировать переменные экземпляра подчеркиванием. Он может быть полезен несколькими способами: во-первых, он упрощает поиск переменных экземпляра в файле .m; во-вторых, это избавляет разработчиков от необходимости придумывать творческие имена для параметров методов, чтобы избежать столкновения с именами переменных экземпляра; и три, как отметили другие, указывают на то, что переменные экземпляра являются частными, и поэтому к ним не следует обращаться волей и неволей по всему коду.

Фактически, я бы посоветовал избегать прямого доступа к переменным экземпляра в методах, отличных от методов доступа (геттеры и сеттеры), -dealloc и -init.... Не то чтобы вы никогда не должны их использовать где-либо еще, но вы должны хотя бы немного подумать, прежде чем использовать переменную экземпляра непосредственно в других методах.

3 голосов
/ 20 августа 2012

Это действительно очень полезно, но большинство людей не знают почему, и это позор. Apple использует подчеркивания, чтобы отделить способ доступа других объектов к переменным конкретного объекта и способ доступа определенного объекта к своим собственным переменным. Теперь это может звучать немного странно, но представьте себе следующее: Вы, вероятно, все узнаете следующее предупреждение компилятора

.h
@property (nonatomic, retain, readonly) UITableView *tableView;

.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self loadSomethingElseForTableView:tableView];
}

Это приведет к предупреждению компилятора, поскольку он не знает, ссылаетесь ли вы на локальную переменную "tableView" или переменную экземпляра. Поэтому Apple рекомендует добавить следующее в начало вашей реализации @.

@synthesize tableView = _tableView;

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

Кроме того, это значительно упрощает понимание сборки мусора в Obj-C и предотвращает совершение типичных ошибок.

Например, при выполнении следующих действий:

@property (nonatomic, retain, readonly) NSString *title;

- (id)initWithTitle:(NSString *)title {
    if ((self = [super init])) {
        self.title = title; // Is not possible, since it's read only.
        title = title; // Is not possible, since it's the same (local) variable.
        // Changing the method to initWithTitle:(NSString *)aTitle;
        title = aTitle;
    }
    return self;
}

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

Так что, в принципе, важно понимать разницу между self.variable и (_) variable. (то есть: self.variable отображается на [self setVariable:...] и variable отображается непосредственно на ваш указатель.

Кроме того, когда вы добавляете его как частную переменную, например:

@interface TSSomeObject : NSObject {
@private
    NSString *_privateTitle;
}
@end

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

То, что является неправильным, заключается в создании свойства с префиксом подчеркивания, например:

@property (nonatomic, retain) NSString *_title;

Это действительно неправильно, и я даже не собираюсь объяснять, почему;)


Так что да! Вы должны действительно использовать префиксы подчеркивания, это делает ваш код намного проще для чтения и интерпретации компилятором! В Xcode 4 Apple даже добавила эти @synthesize s к шаблонам по умолчанию.

0 голосов
/ 09 августа 2013

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

В соответствии с соглашением и рекомендацией, приведенными в приведенном выше документе, вам следует ставить префикс ivars с подчеркиванием.

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

Но использование одно и то же, чтобы указать на использование ивара, где бы он ни находился.

Я, однако, открыт к возможности, что в этом контексте использование подчеркивающего префикса ivar может сигнализировать пользователю, что они делают что-то не так. Между тем, для чистых иваров можно использовать подчеркивание с постфиксом, к которому есть прямой доступ.

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

http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

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

0 голосов
/ 18 апреля 2010

Apple резервирует имена, начинающиеся с подчеркивания, для своих собственных иваров и методов. В Objective-C на любой платформе Apple рекомендуется не ставить перед вашими идентификаторами подчеркивание.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html

0 голосов
/ 18 апреля 2010

Обычно они используются для переменных, к которым нельзя обращаться за пределами текущего файла / модуля / пространства имен / чего бы то ни было, в языках, которые не поддерживают ограничение доступа чем-то вроде private ключевого слова

...