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.