Что работает быстрее: weak или unowned ссылка в Swift?

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

Ответ

С точки зрения производительности unowned ссылка теоретически быстрее, но разница настолько ничтожна, что выбор должен основываться на семантике жизненного цикла объектов, а не на скорости.

Сравнение:

Критерий weak unowned
Тип Опциональная ссылка (T?) Неопциональная ссылка (T)
Поведение Автоматически становится nil при освобождении объекта. Не становится nil; обращение к освобожденному объекту вызывает краш (dangling pointer).
Накладные расходы Требует проверки на nil при разыменовании и механизма zeroing weak ref. Не требует проверки, работает почти как обычная ссылка.
Использование Когда ссылаемый объект может быть освобожден раньше. Когда ссылаемый объект гарантированно живет не меньше, чем ссылающийся (например, дочерний объект, который не переживает родительский).

Пример выбора:

// weak: ViewController может быть освобожден, пока сетевой запрос выполняется
apiService.fetchData { [weak self] result in
    self?.handle(result) // Безопасно, self может быть nil
}

// unowned: CreditCard не может существовать без Customer
class Customer {
    var card: CreditCard?
}
class CreditCard {
    unowned let owner: Customer // owner всегда будет существовать, пока существует card
    init(owner: Customer) { self.owner = owner }
}

Вывод: Всегда выбирайте weak для безопасности, если есть сомнения в жизненном цикле. Используйте unowned только при абсолютной уверенности, что объект «переживет» ссылку, — это микрооптимизация, оправданная лишь в очень редких, критичных к производительности сценариях.