#objective-c #properties #automatic-ref-counting #ivar
#objective-c #свойства #автоматический подсчет ссылок #ivar
Вопрос:
Насколько я понимаю, при установке ivar теперь сохраняется назначаемый ему объект, поскольку при установке переменных по умолчанию strong
используется квалификатор. Поскольку ivar находятся в области видимости объекта, в котором они объявлены, и strong
сохраняют объекты в области видимости переменной, это означает, что значение ivar никогда не будет освобождено, пока объект, содержащий ivar, все еще активен.
Правильно ли это?
Если да, правильно ли я считаю, что с точки зрения управления памятью больше нет разницы между сохраняющим (сильным) свойством и простым ivar?
Комментарии:
1. Хороший вопрос, в какой-то момент я сам задавался этим вопросом.
Ответ №1:
Если переменная:
- Объявляется в классе с использованием ARC.
- Используется исключительно для реализации класса (не предоставляется как часть интерфейса класса).
- Не требует никакого KVO.
- Не требует никакого пользовательского средства получения / установки.
Тогда уместно объявить его как 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.