Это действительно очень полезно, но большинство людей не знают почему, и это позор.
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 к шаблонам по умолчанию.