общественные объекты и использование имущества - PullRequest
3 голосов
/ 01 июля 2011

Я немного смущен; если объект объявлен в файле .h, он автоматически считается "публичным", верно? Мы используем @property в файле .h, однако, чтобы редактировать их? Вот где я не понимаю: мы используем getter / setter для частных объектов, так почему мы используем @property для объектов, объявленных в файле .h и, таким образом, рассматриваемых как «публичные»?

Во-вторых, я нашел этот пример: я не понимаю, почему мы используем @synthesize для primaryKey в этом коде: http://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png и почему мы не используем @property для database объекта?

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Неправильно, что если объект (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

В этом коде:

  1. @synthesize предоставит реализацию для получения / установки для anotherClassObj, поэтомуВы можете использовать синтаксис: self.anotherClassObj = obj1;этот синтаксис может использоваться в равной степени как внутри, так и вне реализации класса;

  2. , когда у вас нет метода получения / установки (автоматически или сгенерированного), вы можете назначить его непосредственно ивару с помощьюсинтаксис _aThirdClassObj = obj2;, с семантикой простого копирования указателя;в любом случае, _aThirdClassObj не будет доступен извне этого класса;

  3. , кроме того, @property ... anotherClassObj, несмотря на это, вы все равно можете ссылаться на _anotherClassObj непосредственно в файле .m, как в _anotherClassObj = xxx, минуя геттер / сеттер, если вам это когда-либо понадобится.

Одна вещь, которую вы должны иметь в виду, это то, что геттер / сеттер - это не только способ сделать ивар "публичным".Они также играют важную роль в управлении счетом сохранения (в зависимости от того, какой спецификатор вы выберете среди сохранения / назначения / копирования в объявлении свойства).Таким образом, в self.anotherClassObj = obj1; выше, obj1 присваивается _anotherClassObj, и он также сохраняется (и если _anotherClassObj ранее указывал на объект, этот объект будет отправлен release).Необработанное назначение ивара не предоставляет такого рода средства.

По моему мнению, функция сохранения свойств счетчика гораздо важнее, чем видимость для принятия решения, использовать ли мне свойство или нет.

2 голосов
/ 01 июля 2011

Не все в заголовке общедоступно, по умолчанию ivars (элементы в {}) защищены @.Цель @property - инкапсуляция данных.@synthesize или @dynamic используется для объявления того, как вы хотите реализовать свое свойство, и одно или другое необходимо для предотвращения сбоев и предупреждений.

Ресурсы: Определение классов @protected, @package, @private, @public reference Объявленные свойства @property ссылка

...