Sobes.tech
Junior — Middle

Ar situacijos, susijusios su silpnų (unowned) nuorodų naudojimu, gali sukelti programos gedimą? Pateikite pavyzdį.

sobes.tech AI

Atsakymas iš AI

Taip, naudojant silpnus (unowned) nuorodus Swift gali sukelti programos avariją, jei nuoroda į objektą, kurį nurodo unowned nuoroda, jau buvo atlaisvinta, o vėliau bandoma prieiti prie šios nuorodos.

Unowned nuorodos daro prielaidą, kad objektas visada egzistuoja, kol nuoroda yra gyva. Jei taip nėra, programa sugrius su klaida "EXC_BAD_ACCESS".

Pavyzdys:

class Person {
    var apartment: Apartment?
}

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

var john: Person? = Person()
john!.apartment = Apartment(tenant: john!)

john = nil // Person objektas atlaisvinamas

// Dabar apartment.tenant yra unowned nuoroda į jau atlaisvintą objektą
// Bandymas prieiti prie jos sukels avariją
print(john!.apartment!.tenant) // avarija

Kad išvengtumėte tokių avarijų, turite įsitikinti, kad unowned nuoroda nebus naudojama po objekto atlaisvinimo, arba naudoti weak nuorodas, kurios tampa nil po objekto atlaisvinimo.