Подчеркнуть префикс в имени свойства?

Возможный дубликат:
Как работает подчеркивание перед переменной в классе 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

Другие вопросы по тегам