1

Когда вы создаете свойство, и компилятор автоматически синтезирует базовый ivar, имеет ли ivar ту же самую семантику сохранения свойство, или семантика сохранения применяется только к «setter»?Какова сохранившаяся семантика синтезированного ivar?

@property (nonatomic, strong) NSObject *strongObject 
@property (nonatomic, weak) NSObject *weakObject 

_strongObject = [[NSObject alloc] init]; // is this strong? 
_weakObject = [[NSObject alloc] init]; // is this weak? 

ответ

1

Проверьте this вопрос. Похоже, что базовая переменная имеет ту же семантику, что и свойство, если вы используете ARC. Вы можете переопределить сеттер к сильному свойству, как это:

- (void)setMyObject:(MyObject *)anObject 
{ 
    _myObject = anObject; 
} 

Это означает, что вы не должны выпустить до (как в не-ARC), так как ARC обрабатывает это на уровне Ивара (см here).

Однако это неверно, если не использовать ARC, например, назначать и сохранять, НЕВОЗМОЖНО для ivars, только для свойств.

+0

Означает ли это также, что прямое назначение ivar с семантикой копирования фактически сделает копию? Возьмем следующий пример: '@property (nonatomic, copy) NSString * myString;' Custom setter выглядит как 'if (_myString == nil) _myString = @" A "; return _myString; ' – Steveo

+0

Хм, это выглядит странно (особенно оператор return для сеттера), но нет, вам нужно скопировать его явно. ARC обрабатывает счет сохранения, а не операцию копирования. – Merlevede

+0

Мой плохой. Возвратного оператора не должно было быть. – Steveo

Смежные вопросы