Я новичок в iOS-разработке в целом и никогда не имел дело с ручным подсчетом ссылок (retain, release, autorelease). Таким образом, я плохо понимаю, что делает магия ARC.
Я думал, что понял, пока меня не спросили, какой тип собственности ( weak
, strong
, assign
и т. на объект, например:
@property (readonly,nonatomic) NSString* name;
Я читал здесь
Вопросы о @свойстве только для чтения в ARC, которое исключает strong
/ weak
, не будет фактически компилироваться, если вы не укажете резервную переменную, когда вы @ синтезировать
свойство; Просто так случилось, что я указывал резервную переменную следующим образом:
@synthesize name = _name;
Теперь я понимаю, что по умолчанию «квалификатор времени жизни» переменной является сильным, отсюда: http://developer.apple.com/library/ ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4
Короче говоря, я косвенно определяю свое свойство как (readonly,nonatomic,strong)
поскольку _name
ivar неявно объявляется как __strong
.
У меня есть несколько вопросов:
Является ли strong
правильным квалификатором времени жизни? Я предполагаю, что это так, иначе объект, поддерживающий мой NSString*
, нигде не принадлежал бы и, таким образом, был бы автоматически освобожден (исходя из земли Java, это имеет смысл, поскольку по умолчанию все ссылки сильные).
Есть ли другие модификаторы, которые имеют смысл в этой ситуации, такие как copy
или assign
?
Влияет ли объявление свойства как (только для чтения, неатомарного, сильного)
и (только для чтения, неатомарного)
на код, который использует свойство? например. объявление его без ключевого слова strong
приводит к тому, что указатель объекта сохраняется как __unsafe_unretained
, где свойство strong
будет храниться в __strong
указатель?
Спасибо!
РЕДАКТИРОВАТЬ
Итак, как я теперь понимаю, к свойствам только для чтения применяется следующее:
(только чтение, назначение)
.(только для чтения, сильный)
или (только для чтения, копирование)
— эти функции одинаковы для свойств только для чтения, но вам может понадобиться семантика копирования, если вы расширите/ подкласс и повторно объявите свойство как readwrite
.(только чтение, слабый)
имеет смысл только в том случае, если вы собираетесь хранить уже слабый указатель в этом свойстве (этот указатель должен быть сильным в другом месте, иначе объект будет освобожден).