В чем основные риски использования `unowned` вместо `weak`?

«В чем основные риски использования `unowned` вместо `weak`?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевой риск 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.