Sobes.tech
Junior — Middle

Meg tudná magyarázni, mit jelent az 'unowned' kulcsszó használata erős hivatkozásokkal Swiftben, és hogyan befolyásolja ez a memória kezelést?

sobes.tech MI

Válasz az MI-től

Swiftben a unowned kulcsszó egy gyenge (unowned) hivatkozás deklarálására szolgál, amely nem növeli az objektum hivatkozásszámát, de feltételezi, hogy az objektum az egész hivatkozás élettartama alatt létezik.

Ez azt jelenti, hogy a unowned hivatkozás nem tartja az objektumot memóriában, de amikor hozzáfér hozzá, a program nem ellenőrzi, hogy az objektum létezik-e, és ha az objektum már felszabadult, futási időben hiba (crash) lép fel.

Különbség a weak-hez képest:

  • A weak hivatkozások opcionálisak és automatikusan nil értékre változnak, ha az objektum felszabadul.
  • A unowned hivatkozások nem opcionálisak és nem válnak nil-é, így biztonságosan használhatók, amikor biztosak vagyunk benne, hogy az objektum hosszabb ideig fog létezni, mint a hivatkozás.

Példa:

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

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

Itt az Apartment tartalmaz egy unowned hivatkozást a Person-re, mivel feltételezzük, hogy a Person hosszabb ideig fog létezni, mint a lakás.