Sobes.tech
Назад к вопросам
Junior — Middle
74

Чем отличаются ссылки типа Weak и Unowned в управлении памятью?

Компании, где спрашивали
Itexus
Winline
ITFB
МТСМТС
Разумные решенияРазумные решения
Альфа-БанкАльфа-Банк
AvitoAvito
KTS
VKVK
Spider Group
iviivi
bip.ru
Touch Instinct
Вкусно и точкаВкусно и точка
ОдноклассникиОдноклассники
БКС
VK знакомстваVK знакомства
Летуаль

Ответ от нейросети

sobes.tech AI

В Swift ссылки типа weak и unowned используются для предотвращения циклов сильных ссылок (retain cycles) при управлении памятью, но отличаются по поведению и применению.

  • Weak (слабая ссылка):

    • Может быть nil.
    • Объявляется как опциональный тип (var delegate: SomeDelegate? weak).
    • Используется, когда ссылка может стать nil в течение жизни объекта, например, делегаты.
    • Система автоматически обнуляет weak ссылку, когда объект, на который она ссылается, освобождается.
  • Unowned (безвладелец):

    • Не может быть nil (неопциональный тип).
    • Используется, когда ссылка гарантированно существует во время жизни объекта, например, родитель-сын.
    • Если объект, на который ссылается unowned, уже освобождён, попытка доступа приведёт к ошибке времени выполнения (crash).

Пример:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

// Здесь tenant — unowned, так как квартира не может существовать без жильца.

class DelegateHolder {
    weak var delegate: SomeDelegate?
}

// Делегат — weak, так как может быть освобождён раньше.

Таким образом, weak подходит для ссылок, которые могут стать nil, а unowned — для ссылок, которые всегда должны быть валидными во время жизни объекта.