Подтвердить что ты не робот

Является ли self.iVar необходимым для сильных свойств с ARC?

  • Если я объявляю свойство сильным, например:

    @property (strong, nonatomic) UIView *iVar;
    

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

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

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

4b9b3361

Ответ 1

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

  • Если свойство не отмечено nonatomic, тогда доступ к базовому ivar не займет блокировки, и вы будете нарушать последствия атомарности.
  • Если свойство переопределено либо вами, либо подклассом, переопределенный установщик не будет вызываться.
  • Уведомления KVO не будут отправляться.

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