Ответ
В практике iOS-разработки weak используется значительно чаще, чем unowned.
Причина: Безопасность. Ссылка weak автоматически становится nil при освобождении объекта, на который она указывала. Попытка доступа к weak свойству, которое стало nil, безопасна и просто вернет nil.
class ViewController: UIViewController {
weak var delegate: DataLoaderDelegate? // Безопасно
// delegate становится nil, если объект делегата деаллоцирован
}
unowned предполагает, что ссылаемый объект будет существовать на протяжении всей жизни ссылающегося объекта. Если это предположение нарушится, обращение к unowned ссылке вызовет краш приложения (небезопасное разыменование).
class Parent {
var child: Child?
}
class Child {
// ОПАСНО: если Parent будет деаллоцирован раньше Child, это вызовет краш.
unowned let parent: Parent
init(parent: Parent) { self.parent = parent }
}
Когда что использовать:
weak: Для опциональных связей, где объект может быть освобожден независимо (делегаты, замыкания, захваченные в нихself).unowned: Только когда время жизни объектов строго связано, и вы абсолютно уверены, что ссылаемый объект переживет ссылающийся. Классический (но все же рискованный) пример — захват[unowned self]в замыкании, которое гарантированно выполнится до деаллокацииself.
Из-за приоритета безопасности и избегания скрытых багов, большинство команд и гайдлайнов рекомендуют weak по умолчанию.