Автоматически ли компилятор ARC определяет, сохранять или назначать в переопределенном классе в зависимости от атрибутов свойства?

#objective-c #setter #automatic-ref-counting

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

Вопрос:

Я недостаточно хорошо знаю ассемблер, чтобы понимать такой сложный код, как Assembly для всего проекта, но я заметил, что если я добавляю strong атрибут к свойству, _objc_storeStrong вызов отображается рядом со строкой в моем установщике, где я правильно меняю свой;

 @interface ClassName : NSObject

@property (strong, nonatomic) NSSet *mySet;

@end


@implementation ClassName

@synthesize mySet;

-(void)setMySet:(NSSet *)newMySet
{
   mySet = newMySet;
   //do stuff
}

@end
 

Итак? я прав? Автоматически ли компилятор ARC определяет, сохранять или назначать в переопределенном классе в зависимости от атрибутов свойства?

Ответ №1:

Короче говоря, да. Поскольку вы задали свойство как strong , оно будет сохранено объектом. Если вы объявите свойство as weak , подразумеваемая (синтезированная) переменная is __weak NSSet *mySet и это не сохранит объект, но это будет указатель с автоматическим обнулением.

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

1. Спасибо. Итак, компилятор определяет это в зависимости от подразумеваемого iVar? Итак, я настраиваю свойство, оно подразумевает ivar, а затем компилятор решает, как сохранить в нем значение? Для меня это не намного лучше, но, может быть, я пойму это лучше.

2. Да, это правильно. strong подразумевает __strong , что это то же retain самое, что и в MRC. (Значение по умолчанию равно assign или unsafe_unretained , оба из которых подразумевают __unsafe_unretained , что является тем же, assign что и в MRC).