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

Недвижимость против ivar во времена ARC

Я понимаю, что установка ivar теперь сохраняет объект, назначенный ему, поскольку установка переменных по умолчанию соответствует квалификатору strong. Поскольку ivars находятся в области объекта, в котором они объявлены, а strong сохраняет объекты в пределах области действия переменной, это означает, что значение ivars никогда не будет выпущено, пока объект, содержащий ivar, все еще жив.

Правильно ли это?

Если это так, я прав, думая, что с точки зрения управления памятью нет никакой разницы между сохраняющим (сильным) свойством и простым иваром?

4b9b3361

Ответ 1

Если переменная:

  • Объявляется в классе с помощью ARC.
  • Используется исключительно для реализации класса (не отображается как часть интерфейса класса).
  • Не требуется KVO.
  • Не требует пользовательского getter/setter.

Тогда уместно объявить его как ivar без соответствующего @property/@synthesize и ссылаться на него непосредственно в реализации. Он встроен в Encapsulation, чтобы объявить этот ivar в файле реализации класса.

// MyClass.h
@interface MyClass : ParentClass
@end

// MyClass.m
@implementation MyClass {
    NSString *myString;
}

- (void)myMethod {
    myString = @"I'm setting my ivar directly";
}
@end
  • Этот ivar будет рассматриваться как __strong компилятором ARC.
  • Он будет инициализирован nil, если это объект, или 0, если он является примитивным.

Ответ 2

Вы не можете использовать KVO и делать пользовательские getter и seters с переменными экземпляра, отличными от того, что они очень похожи при использовании ARC.