Подчеркивать префикс имени свойства?
Возможный дубликат:
Как подчеркивается символ подчеркивания перед переменной в классе cocoa objective-c?
Может ли кто-нибудь указать мне на объяснение использования подчеркивания, я всегда предполагал, что они используются, чтобы подчеркнуть, что вы обращаетесь к iVar [_window release];
, а не обращаетесь к iVar через метод setter/getter [[self window] release];
или [self.window release];
Я просто хочу проверить правильность моего понимания.
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UILabel *markerLabel;
@synthesize window = _window;
@synthesize markerLabel = _markerLabel;
Ответы
Ответ 1
Использование подчеркивания для имен ivar - это соглашение, впервые используемое Apple для различения фактического ivar и свойства. С тех пор многие люди приняли эту конвенцию.
Причина этого заключается в том, чтобы предотвратить ошибку присвоения нового значения ivar вместо фактического сеттера:
myIvar = newValue;
вместо
self.myIvar = myValue;
Если вы случайно используете верхний пример, вы можете вызвать утечку памяти. Подчеркивание препятствует вам совершить эту ошибку.
Ответ 2
Это соглашение, и ваше понимание звучит прекрасно.
Другим достоинством этого соглашения является то, что вы не можете случайно получить доступ к ivar без использования setter, потому что
view = viewController.view ; // usually bad
не будет компилироваться, если ivar _view
вместо view
.
Я обычно не объявляю ivar, и просто использую @property
и @synthesize
. Без явного объявленного ivar компилятор (по крайней мере, последний) автоматически генерирует ivar (с тем же именем.) Таким образом, код выше компилируется без проблем и не служит защитой от использования setter, но вы может покончить с одной строкой кода.... что может быть плохой целью, и я не рекомендую вам: p