Я новичок в разработке iOS в целом и никогда не рассматривал ручной подсчет ссылок (сохранение, выпуск, автореле). Таким образом, я не очень хорошо понимаю, что делает магический ARC.
Я думал, что понял, до тех пор, пока меня не спросят, какой тип собственности (weak
, strong
, assign
и т.д.) должен быть присвоен свойству readonly, указывающему на объект, например:
@property (readonly,nonatomic) NSString* name;
Я читаю здесь
Вопросы о readonly @property в ARC, что отказ от strong
/weak
на самом деле не будет компилироваться, если вы не укажете опорную переменную, если вы @synthesize
имущество; Я просто так описал поддержку ивара таким образом:
@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
? -
Объявляет ли свойство как
(readonly,nonatomic,strong)
и(readonly,nonatomic)
какое-либо значение для кода, который потребляет свойство? например. объявляет его без ключевого словаstrong
, потому что указатель объекта должен быть сохранен как__unsafe_unretained
, где свойствоstrong
будет храниться в указателе__strong
?
Спасибо!
ИЗМЕНИТЬ
Итак, как я понимаю, для свойств readonly применяется следующее:
- Для типов non-NSObject * (int, float, void * и т.д.) используйте
(readonly, assign)
. - Для указателей объектов используйте
(readonly, strong)
или(readonly, copy)
- эти функции одинаковы для свойств readonly, но вам может понадобиться семантика копии, если вы расширяете/подкласс и переопределяете свойство какreadwrite
. - Для указателей объектов
(readonly, weak)
имеет смысл только в том случае, если вы собираетесь хранить уже слабый указатель в этом свойстве (этот указатель должен быть сильным в другом месте или объект будет освобожден).