Неправильно, что если объект (ivar) объявлен в файле .h, то он является общедоступным.Это только в том случае, если предоставляются методы получения / установки, в противном случае это не так.
Действительно, директивы @property
/ @synthesize
являются средствами, предназначенными для объявления и определения стандартных методов получения / установки.Таким образом, вместо того, чтобы писать их самостоятельно, вы просто используете директивы.
Стоит также отметить, что при объявлении свойств вы получаете возможность использовать точечную запись для ссылки на свойства ваших объектов.А также, что они многое объясняют, благодаря спецификаторам retain
/ assign
/ copy
, как предполагается управление памятью для этих свойств.(И, конечно, @synthesize
просто сделает это правильно для вас).
Фактически, о вашем образце, независимо от того, связан ли ivar со свойством или нет, это выбор дизайна.Возможно, вы просто пересмотрите предположение, что ivars, объявленные в файлах .h, по умолчанию являются открытыми, и это станет более понятным.Другими словами: primaryKey
является общедоступным, database
- нет.
Очень хороший учебник можно найти здесь , но также не забывайте Apple docs .
РЕДАКТИРОВАТЬ:
о вашем вопросе из раздела комментариев:
необязательно, чтобы у каждого ивара было свойство, или чтобы у него был получатель / установщик, чтобы бытьиспользуется внутри реализации этого класса.
@interface SomeClass : NSObject {
AnotherClass* _anotherClassObj;
AThirdClass* _aThirdClassObj;
}
@property (nonatomic, retain) AnotherClass* anotherClassObj;
@end
Итак, у вас есть два ивара;только один получил объявление @property
.В вашем файле .m вы можете иметь, например,
@implementation SomeClass;
@synthesize anotherClassObj = _anotherClassObj;
- (void)initWithClasses:(AnotherClass*)obj1 and:(AThirdClass*)obj2 {
.....
self.anotherClassObj = obj1;
_aThirdClassObj = obj2;
...
}
....
@end
В этом коде:
@synthesize
предоставит реализацию для получения / установки для anotherClassObj
, поэтомуВы можете использовать синтаксис: self.anotherClassObj = obj1
;этот синтаксис может использоваться в равной степени как внутри, так и вне реализации класса;
, когда у вас нет метода получения / установки (автоматически или сгенерированного), вы можете назначить его непосредственно ивару с помощьюсинтаксис _aThirdClassObj = obj2;
, с семантикой простого копирования указателя;в любом случае, _aThirdClassObj
не будет доступен извне этого класса;
, кроме того, @property ... anotherClassObj
, несмотря на это, вы все равно можете ссылаться на _anotherClassObj
непосредственно в файле .m, как в _anotherClassObj = xxx
, минуя геттер / сеттер, если вам это когда-либо понадобится.
Одна вещь, которую вы должны иметь в виду, это то, что геттер / сеттер - это не только способ сделать ивар "публичным".Они также играют важную роль в управлении счетом сохранения (в зависимости от того, какой спецификатор вы выберете среди сохранения / назначения / копирования в объявлении свойства).Таким образом, в self.anotherClassObj = obj1;
выше, obj1
присваивается _anotherClassObj
, и он также сохраняется (и если _anotherClassObj
ранее указывал на объект, этот объект будет отправлен release
).Необработанное назначение ивара не предоставляет такого рода средства.
По моему мнению, функция сохранения свойств счетчика гораздо важнее, чем видимость для принятия решения, использовать ли мне свойство или нет.