Подтвердить что ты не робот

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

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

Ответ 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