Ответ
С точки зрения производительности 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 только при абсолютной уверенности, что объект «переживет» ссылку, — это микрооптимизация, оправданная лишь в очень редких, критичных к производительности сценариях.