Sobes.tech
Junior — Middle

Koja je razlika između Weak i Unowned referenci u upravljanju memorijom?

sobes.tech АИ

Одговор од АИ

U Swift-u, reference tipovi weak i unowned koriste se za sprečavanje ciklusa jakih referenci (retain cycles) u upravljanju memorijom, ali se razlikuju po ponašanju i primeni.

  • Weak (slaba referenca):

    • Može biti nil.
    • Deklariše se kao opcionalni tip (var delegate: SomeDelegate? weak).
    • Koristi se kada referenca može postati nil tokom životnog veka objekta, na primer, delegati.
    • Sistem automatski postavlja weak referencu na nil kada referencirani objekat bude oslobođen.
  • Unowned (bez vlasnika):

    • Ne može biti nil (neopcionalni tip).
    • Koristi se kada referenca garantovano postoji tokom celog životnog veka objekta, na primer, između roditelja i deteta.
    • Ako je referencirani objekat već oslobođen, pokušaj pristupa će izazvati grešku u izvršenju (crash).

Primer:

class Person {
    var apartment: Apartment?
}

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

// Ovde je tenant unowned, jer stan ne može postojati bez stanara.

class DelegateHolder {
    weak var delegate: SomeDelegate?
}

// Delegat je weak, jer može biti oslobođen ranije.

Dakle, weak je pogodan za reference koje mogu postati nil, a unowned za one koje uvek moraju biti važeće tokom životnog veka objekta.