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

Можете объяснить концепцию unowned в контексте безопасного обращения с ссылками в Swift?

Компании, где спрашивали
МТСМТС
Альфа-БанкАльфа-Банк
AvitoAvito
Uzum

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

sobes.tech AI

В Swift unowned — это модификатор ссылки, который указывает, что ссылка не владеет объектом, на который ссылается, но при этом предполагается, что объект будет существовать в момент обращения к этой ссылке.

В отличие от weak, unowned не является опциональной ссылкой и не хранит nil. Если объект, на который ссылается unowned, уже освобождён, обращение к такой ссылке приведёт к крашу.

Используется unowned для предотвращения циклов сильных ссылок (retain cycles), когда одна из ссылок гарантированно будет существовать дольше другой.

Пример:

class Person {
    let name: String
    var apartment: Apartment?
    init(name: String) { self.name = name }
}

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

let john = Person(name: "John")
let apt = Apartment(unit: "4A", tenant: john)
john.apartment = apt

Здесь Apartment хранит unowned ссылку на Person, так как Person гарантированно будет существовать дольше Apartment. Это предотвращает retain cycle, но требует уверенности, что tenant не будет освобождён раньше Apartment.