Как правильно объявить свойство readonly для ios с помощью ARC

Я новичок в 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)поскольку _nameivar неявно объявляется как __strong.

У меня есть несколько вопросов:

  1. Является ли strongправильным квалификатором времени жизни? Я предполагаю, что это так, иначе объект, поддерживающий мой NSString*, нигде не принадлежал бы и, таким образом, был бы автоматически освобожден (исходя из земли Java, это имеет смысл, поскольку по умолчанию все ссылки сильные).

  2. Есть ли другие модификаторы, которые имеют смысл в этой ситуации, такие как copyили assign?

  3. Влияет ли объявление свойства как (только для чтения, неатомарного, сильного)и (только для чтения, неатомарного)на код, который использует свойство? например. объявление его без ключевого слова strongприводит к тому, что указатель объекта сохраняется как __unsafe_unretained, где свойство strongбудет храниться в __strongуказатель?

Спасибо!

РЕДАКТИРОВАТЬ

Итак, как я теперь понимаю, к свойствам только для чтения применяется следующее:

  • Для типов, отличных от NSObject* (int, float, void* и т. д.), используйте (только чтение, назначение).
  • Для указателей объектов используйте (только для чтения, сильный)или (только для чтения, копирование)— эти функции одинаковы для свойств только для чтения, но вам может понадобиться семантика копирования, если вы расширите/ подкласс и повторно объявите свойство как readwrite.
  • Для указателей на объекты (только чтение, слабый)имеет смысл только в том случае, если вы собираетесь хранить уже слабый указатель в этом свойстве (этот указатель должен быть сильным в другом месте, иначе объект будет освобожден).

16
задан Community 23 May 2017 в 12:09
поделиться