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