Ответ
Ключевой риск unowned — небезопасное разыменование. Это ссылка, которая не увеличивает счетчик ссылок (ARC) и не обнуляется автоматически (non-optional). Если объект, на который она указывает, будет освобожден, попытка доступа вызовет краш (EXC_BAD_ACCESS).
Сравнение weak vs unowned: |
Критерий | weak |
unowned |
|---|---|---|---|
| Безопасность | Безопасна. Становится nil. |
Небезопасна. Приводит к крашу. | |
| Тип | Опциональный (T?). |
Неопциональный (T). |
|
| Использование | Когда объект может быть освобожден. | Когда объект гарантированно живет дольше. |
Опасный пример:
class Processor {
unowned let formatter: Formatter // Рискованно!
init(formatter: Formatter) { self.formatter = formatter }
func process() {
print(formatter.name) // CRASH, если formatter удален.
}
}
Безопасная альтернатива с weak:
class Processor {
weak var formatter: Formatter? // Безопасно.
func process() {
guard let formatter = formatter else { return } // Грамотная проверка.
print(formatter.name)
}
}
Правило: Используйте unowned только при строгой гарантии жизненного цикла, например, когда self владеет объектом, который хранит unowned ссылку на этот же self (классический пример — [unowned self] в замыкании, время жизни которого точно короче). В сомнительных случаях всегда выбирайте weak.