Недвижимость против Ивара во времена АРК - PullRequest
56 голосов
/ 20 октября 2011

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

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

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

Ответы [ 2 ]

69 голосов
/ 30 ноября 2011

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

  1. Объявлен в классе, используя ARC .
  2. Используется исключительно для реализации класса (не предоставляется как часть интерфейса класса).
  3. Не требует КВО .
  4. Не требует каких-либо пользовательских методов получения / установки.

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

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

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

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

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

...