Я новичок в разработке 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)имеет смысл только в том случае, если вы собираетесь хранить уже слабый указатель в этом свойстве (этот указатель должен быть сильным в другом месте или объект будет освобожден).