Ответ
unowned — это аналог weak, который также не увеличивает счетчик сильных ссылок (retain count).
Ключевая особенность unowned: он объявляется как неопциональный тип и не становится nil после освобождения объекта. Вместо этого обращение к освобожденной unowned ссылке приводит к неопределенному поведению и крашу.
Сравнение на примере:
// weak ссылка (опциональная, безопасная)
class ViewController {
weak var delegate: DataDelegate? // Может стать nil
}
// unowned ссылка (неопциональная, требует гарантий)
class CreditCard {
unowned let owner: Customer // Не опциональна. Предполагается, что owner всегда есть.
init(owner: Customer) { self.owner = owner }
}
Правила выбора:
- Используйте
weak, если ссылка может статьnilв течение жизни объекта (делегаты,IBOutlet, замыкания, захватывающиеself). - Используйте
unowned, только если вы абсолютно уверены, что объект, на который ссылаются, никогда не будет освобожден раньше, чем ссылающийся объект. Типичный случай — двунаправленная связь, где один объект является явным владельцем другого.
⚠️ Предупреждение: unowned — это оптимизация и явный контракт. Неверное использование — частая причина сложно отлаживаемых падений.