Sobes.tech
Middle

Mi a különbség a Wick- és az Anound-linkek között?

sobes.tech MI

Válasz az MI-től

Wick-hivatkozás (weak) — ez egy nem tulajdonló hivatkozás. Nem növeli a hivatkozásszámot az objektumon. Akkor használják, amikor el akarják kerülni az erős hivatkozási ciklusokat, például a delegát és a tulajdonosa között. Ha az objektum, amelyre a gyenge hivatkozás mutat, deállokcióra kerül, a gyenge hivatkozás automatikusan nil lesz.

Unowned-hivatkozás (unowned) — ez szintén nem tulajdonló hivatkozás, és nem növeli az objektum hivatkozásszámát. A weak-től abban különbözik, hogy az unowned nem lehet opcionális (Optional), és mindig egy létező objektumra kell mutatnia. Ha az objektum, amelyre az unowned hivatkozás mutat, deállokcióra kerül, mielőtt a hivatkozás megszűnne létezni, a hozzáférés hibát fog eredményezni (fatális hiba). Akkor használják, amikor a kapcsolódó objektum életciklusa garantáltan hosszabb vagy egyenlő az unowned-hivatkozású objektuméval (például erős hivatkozási ciklusok esetén, ahol az egyik objektumnak egyértelműen meghatározott életciklusa van).

Összehasonlítás:

Jellemző weak unowned
Nem tulajdonló Igen Igen
Növeli az SC-t Nem Nem
Lehet nil Igen (automatikusan nullázódik) Nem (objektumra kell mutatnia)
Biztonság Biztonságosabb a deállokció esetén Kevésbé biztonságos (fatális hiba a deállokciózott objektumhoz való hozzáféréskor)
Típus Opcionalis kell legyen Nem lehet opcionális (alapértelmezett)
Használat Erős hivatkozási ciklusok megelőzése, ahol az objektum megszűnhet létezni előbb Erős hivatkozási ciklusok megelőzése, ahol az objektum garantáltan létezik

Példa a weak használatára az erős hivatkozási ciklus megelőzésére:

class Person {
    let name: String
    weak var apartment: Apartment? // gyenge hivatkozás a ciklus elkerülése érdekében

    init(name: String) {
        self.name = name
        print("\(name) inicializálódik")
    }

    deinit {
        print("\(name) deinitializálódik")
    }
}

class Apartment {
    let unit: String
    var occupant: Person?

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) inicializálódik")
    }

    deinit {
        print("Apartment \(unit) deinitializálódik")
    }
}

Példa az unowned használatára a self foglalásával a zárványban:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = {
        [unowned self] in // unowned self a ciklus elkerülése érdekében
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) deinitializálódik")
    }
}