Дальнейшее разъяснение _property после атрибута readonly?

При настройке атрибута readonly в разделе интерфейса это "отключает" метод setter для свойства. Мне нужно уточнить:

  1. В чем смысл свойства readonly, если мы можем просто установить его с помощью _propertyName?
  2. Когда использовать _propertyName, если наше свойство readwrite?

  3. Также я понимаю, что мы используем методы setter для некоторой степени абстракции, а не просто присваиваем значение с помощью _propertyName. Есть ли другая причина НЕ использовать _propertyName?

Вот пример кода ниже. Спасибо.

Интерфейсный раздел

@property (nonatomic, readonly) NSString *licensePlate;
@property (nonatomic, readonly) NSString *bodyColor;

Секция имплантации

-(id) initWithCarFeatures {
 self = [super init]
 if (self) {
 _licensePlate = @"XSHJDS8687";
 _bodyColor = @"blueColor";
 }
 return self;
}
1 ответ

  1. Дело в том, что "инкапсуляция". Никакие другие файлы не смогут напрямую установить свойство. Свойство может быть установлено только из данного файла, например, с помощью init или с использованием специализированного метода.

  2. Большинство людей скажут вам, что вы должны использовать _property непосредственно только в методе init, dealloc (если вы не используете ARC), и, конечно, если вы реализуете свой собственный сеттер и getter. Даже если свойство объявлено как readonly, обычно вы объявляете его readwrite в расширении класса. Таким образом, он останется только для readonly для других файлов, но он будет readwrite для файла реализации (класса), который его объявит.

  3. Многие причины, например, "наследование" - сеттеры могут быть переопределены. Для copy свойств, копирование обрабатывается инкубатором. С MRC (не ARC) сеттеры становятся еще более важными (они обрабатывают сохранности и релизы).

licensed under cc by-sa 3.0 with attribution.