Нужен ли self.iVar для сильных свойств с ARC? - PullRequest
17 голосов
/ 03 ноября 2011
  1. Если я объявляю свойство сильным, например так:

    @property (strong, nonatomic) UIView *iVar;
    

    Когда я его устанавливаю, имеет ли значение, если я сделаю iVar = ... или self.iVar = ...?Кажется, что с ARC они делают то же самое.

  2. Если я объявляю только переменную экземпляра (не @property), например, BOOL selected, значит ли это, что она выводитсябыть __unsafe_unretained (поскольку нет свойства, указывающего, что оно является сильным), или я должен явно указать это?

Похоже, что я мог ответить на свои вопросы выше при ответе ARC: Как освободить статическую переменную? , но я все еще немного запутался в вышеуказанных вопросах.

1 Ответ

20 голосов
/ 03 ноября 2011

С точки зрения управления памятью, использование ivar = ... или self.property = ... (примечание: не существует как self.ivar) - это то же самое. Однако использование ivar = ... не вызывает установщик, в то время как self.property = ... делает. Это имеет 3 важных последствия, в произвольном порядке:

  1. Если свойство не помечено nonatomic, то доступ к нижележащему ивару не займет блокировку, и вы нарушите последствия атомарности.
  2. Если свойство переопределено вами или подклассом, переопределенный установщик не будет вызван.
  3. Уведомления KVO не будут отправлены.

Что касается только объявления ivar, оно имеет ту же семантику управления памятью, что и объявление локальной переменной. Это задокументировано в разделе 4.4 документа Objective-C с автоматическим подсчетом ссылок , но, в основном, если это объект, он будет определен как __strong.

...