Sobes.tech
Middle

Mis vahe on Wick-linkide ja Anound-linkide vahel?

sobes.tech AI

Vastus AI-lt

Wick-viide (weak) — see on mitteomandav viide. See ei suurenda objekti viidete arvu. Seda kasutatakse tugevate viidete tsüklite vältimiseks, näiteks delegeedi ja selle omanikku vahel. Kui objekt, millele viitab nõrk viide, deallokeeritakse, muutub nõrk viide automaatselt nil-iks.

Unowned-viide (unowned) — see on samuti mitteomandav viide ega suurenda objekti viidete arvu. Erinevus weak-ist on selles, et unowned ei saa olla valikuline (Optional) ja peab alati viitama olemasolevale objekti. Kui objekt, millele unowned viide viitab, deallokeeritakse enne, kui viide lõpetab olemasolu, põhjustab selle kasutamine jooksva vea (fatali veaga). Seda kasutatakse seal, kus seotud objekti elutsükkel on garanteeritult pikem või võrdne unowned-viidete objekti elutsükliga (näiteks tugevate viidete tsüklid, kus üks objektidel on selgelt määratletud elutsükkel).

Võrdlus:

Omadus weak unowned
Mitteomandav Jah Jah
Suurendab SC-i Ei Ei
Võib olla nil Jah (automaatne nullimine) Ei (peab viitama objekti)
Turvalisus Rohkem turvaline deallokeerimisel Vähem turvaline (fatali vead)
Tüüp Peab olema valikuline (Optional) Ei saa olla valikuline
Kasutus Tugevate viidete tsüklite vältimiseks, kus objekt võib varakult kaduda Tugevate viidete tsüklite vältimiseks, kus objekt on garanteeritult olemas

Näide weak kasutamisest tugevate viidete tsükli vältimiseks:

class Person {
    let name: String
    weak var apartment: Apartment? // nõrk viide tsükli vältimiseks

    init(name: String) {
        self.name = name
        print("\(name) alustas tööd")
    }

    deinit {
        print("\(name) lõpetas tööd")
    }
}

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

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) alustas tööd")
    }

    deinit {
        print("Apartment \(unit) lõpetas tööd")
    }
}

Näide unowned kasutamisest self haaramiseks suletise sees:

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

    lazy var asHTML: () -> String = {
        [unowned self] in // unowned self, et vältida tsüklit
        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) deinitialiseeriti")
    }
}