Атрибуты свойств: strong, weak, copy, assign — когда что?
Владение
- strong — сильная ссылка, объект живёт, пока свойство на него указывает. По умолчанию для объектных типов под ARC. Для всего, чем объект владеет.
- weak — слабая, автоматически обнуляется при dealloc цели. Для
delegate,dataSource, обратных ссылок на родителя — чтобы не было цикла. Только для объектов, поддерживающих weak (не дляNSTimertarget в старых API — там он всё равно сильный). - copy — сеттер вызывает
copyи хранит снимок. Обязательно для типов с mutable-подклассом:NSString,NSArray,NSDictionary,NSSet,NSData— иначе вам могут передатьNSMutableStringи поменять его после. Для блоковcopyпереносит блок со стека в кучу (под ARCstrongделает то же, ноcopy— документированная конвенция). - assign — простое присваивание без retain. Для скаляров:
NSInteger,CGFloat,BOOL, enum, структур. Для объектов эквивалентноunsafe_unretained— висячий указатель после dealloc, практически не используется. - unsafe_unretained — явный вариант assign для объектов.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep