С ARC необходимо @property - PullRequest
       7

С ARC необходимо @property

3 голосов
/ 17 февраля 2012

С ARC каждое назначение указателя сохраняет по умолчанию.В этом свете, в неатомических случаях, зачем мне вообще объявлять свойства?

Чем они отличаются?

//Property
@interface I1 : NSObject 
@property (nonatomic, strong) NSString* str;
@end

I1 *obj1 = ...;
obj1.str = [[NSString alloc] init...];

//Only member variable
@interface I2 : NSObject { 
@public
    NSString* str;
}
@end
I2 *obj2 = ...;
obj2->str = [[NSString alloc] init...];

Ответы [ 6 ]

2 голосов
/ 17 февраля 2012

Управление памятью - не единственное преимущество использования свойств.

Два, которые мне особенно запомнились, это:

  1. KVO (без необходимости вручную willChangeValueForKey: и didChangeValueForKey: - см. Уведомление об изменении вручную )
  2. Возможность писать собственную логику для сеттера и геттера, а также записывать настройки подкласса для сеттера и геттера.

bbum написал отличный ответ на это в iOS: должен ли каждый iVar действительно быть свойством?

2 голосов
/ 17 февраля 2012

@ property / @ синтезирует пары, автоматически генерирующие геттеры и сеттеры, и таким образом обеспечивают инкапсуляцию.

Конечно, часто эта инкапсуляция может не понадобиться прямо сейчас, но, возможно, в будущем вы решите добавитьотложенная инициализация в iVar или желание опубликовать уведомление при изменении содержимого iVar.Это хорошая привычка всегда использовать свойства и синтезированные или рукописные методы доступа, а стоимость ничтожно мала.Почему бы вам не использовать их?

(Если вы обеспокоены тем, что @ property / @ synthesize слишком много шаблонного, и у вас есть учетная запись Mac Dev, загляните на форум бета-версии.)

2 голосов
/ 17 февраля 2012

Свойства является частью Целевого программирования ориентации .Это инкапсуляция!Как их нельзя использовать ?!Всегда используйте свойства для инкапсуляции ваших данных.

0 голосов
/ 17 февраля 2012

В target-c @property - это просто сокращение для стандартного установщика и / или получателя переменной в классе.Поэтому, независимо от того, включена ли опция ARC, вы можете сделать свой выбор в любое удобное время.

0 голосов
/ 17 февраля 2012

В интерфейсе используйте @property, потому что это публичный доступ к рекламе. Если вы не хотите делать его публичным, поместите объявление @property в расширение класса или объявление ivar в @implementation в файле .m.

0 голосов
/ 17 февраля 2012

Я думаю, что свойства все еще используются для автоматического создания аксессоров и мутаторов, где @public не используется.

...