Преимущество наличия другого имени для ивара, чем для свойства, заключается в том, что вы можете легко увидеть в коде, когда вы обращаетесь к тому или другому — Андре К.
Я не могу найти кнопку «комментировать», поэтому мне приходится публиковать как «ответ».
Просто хотел расширить комментарий Андре - зная, когда вы используете синтезированные свойства по сравнению с ванильной переменной, вы знаете (особенно в случае сеттеров), когда переменная автоматически сохраняется/копируется/освобождается благодаря вашему хорошему сеттеру, а не манипулируют вручную.
Конечно, если вы все делаете правильно, вам, вероятно, не понадобится помощь сеттера для правильного сохранения/освобождения объектов! Но могут быть и другие сценарии, когда обращение к вашим иварам как self.ivar
вместо _ivar
может быть полезным, например, когда вы используете пользовательские сеттеры/геттеры вместо синтезированных по умолчанию. Возможно, каждый раз, когда вы изменяете свойство, вы также хотите сохранить его в NSUserDefaults. Итак, у вас может быть такой код:
@interface SOUserSettings : NSObject {
BOOL _autoLoginOn;
}
@property (nonatomic, assign) BOOL autoLoginOn;
@end
@implementation SOUserSettings
@synthesize autoLoginOn = _autoLoginOn;
- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {
_autoLoginOn = newAutoLoginOnValue;
[[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}
@end
Note: This is just illustrative code, there could be a thousand things wrong with it!
Итак, теперь в вашем коде, если у вас есть строка с надписью _autoLoginOn = YES
, вы знаете, что она не будет сохранена в NSUserDefaults, тогда как если вы используете self.autoLoginOn = YES
, вы точно знаете, что произойдет.
Разница между _autoLoginOn
и self.autoLoginOn
больше, чем просто семантическая.
person
Dev Kanchen
schedule
22.04.2011