Свойство против ivar во время ДУГИ

#objective-c #properties #automatic-ref-counting #ivar

#objective-c #свойства #автоматический подсчет ссылок #ivar

Вопрос:

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

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

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

Комментарии:

1. Хороший вопрос, в какой-то момент я сам задавался этим вопросом.

Ответ №1:

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

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

Тогда уместно объявить его как ivar без соответствующего @property / @synthesize и ссылаться на него непосредственно в реализации. Объявление этого 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 если это примитив.

Комментарии:

1. Не могу быть уверен в 2 элементах. Вы можете получить доступ к общедоступному ivar, используя classInstance->iVar = @»Новое значение»

2. @DenisMikhaylov Хороший момент. Хотя я думаю, что оставлю в «пункте 2», потому что я говорю о наилучшей практике, и, вероятно, не рекомендуется обращаться к ivars класса напрямую.

3. Примечание: ivar неявно определяются с @protected помощью и почти никогда не должны быть явно @public . Определение @private явно, как правило, является хорошей практикой. Также хорошей практикой является префикс ivars с подчеркиванием. @property Фактически таким образом будет неявно @synthesize связан с ним ivar.

Ответ №2:

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