Sobes.tech
Junior — Middle

Situațiile legate de utilizarea referințelor slabe (neposesedate) pot duce la blocarea aplicației? Oferiți un exemplu.

sobes.tech AI

Răspuns de la AI

Da, utilizarea referințelor slabe (unowned) în Swift poate duce la blocarea aplicației dacă obiectul la care face referire referința unowned a fost deja eliberat, iar încercarea de a accesa această referință mai târziu.

Referințele neținute presupun că obiectul există întotdeauna atât timp cât referința este vie. Dacă nu este cazul, aplicația se va prăbuși cu o eroare "EXC_BAD_ACCESS".

Exemplu:

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 // obiectul Person este eliberat

// Acum apartment.tenant este o referință unowned la un obiect deja eliberat
// Încercarea de a accesa această referință va duce la o eroare
print(john!.apartment!.tenant) // eroare

Pentru a evita astfel de erori, trebuie să te asiguri că referința unowned nu va fi utilizată după ce obiectul a fost eliberat, sau să folosești referințe weak, care devin nil după eliberarea obiectului.