Sobes.tech
Middle

Kāda ir atšķirība starp Wick saitēm un Anound saitēm?

sobes.tech AI

Atbilde no AI

Wick saite (weak) — tā ir ne īpašumtiesīga saite. Tā nepalielina objekta saistīto saite skaitu. To izmanto, lai novērstu stipro saistību ciklus, piemēram, starp deleģentu un tā īpašnieku. Ja objekts, uz kuru norāda vājinātā saite, tiek deallokēts, vājinātā saite automātiski kļūst par nil.

Unowned saite (unowned) — tāpat ir ne īpašumtiesīga saite un nepalielina objekta saistīto saite skaitu. Atšķirība no weak ir tā, ka unowned nevar būt opcionala (Optional) un vienmēr jānorāda uz esošu objektu. Ja objekts, uz kuru norāda unowned saite, tiek deallokēts pirms saites piekļuves, mēģinājums piekļūt šai saitei izraisīs izpildes kļūdu (fatālu kļūdu). To izmanto tur, kur saistītā objekta dzīves cikls ir garantēti ilgāks vai vienāds ar unowned saites objekta dzīves ciklu (piemēram, stipro saistību cikls, kurā viens objekts ir ar skaidri noteiktu dzīves ciklu).

Salīdzinājums:

Īpašība weak unowned
Ne īpašumtiesīga
Palielina SC skaitu
Var būt nil Jā (automātiski nullejas) Nē (jānorāda uz objektu)
Drošība Drošāka, ja iespējama deallokācija Mazāk droša (fatāla kļūda piekļūstot deallokētam)
Tips Jābūt opcionalam Nevar būt opcionala
Lietošana Stipro saistību ciklu novēršana, ja objekts var tikt deallokēts agrāk Stipro saistību ciklu novēršana, ja objekts ir garantēti pastāvīgs

Piemērs weak izmantošanai, lai novērstu stipro saistību ciklu:

class Person {
    let name: String
    weak var apartment: Apartment? // vājināta saite, lai novērstu ciklu

    init(name: String) {
        self.name = name
        print("\(name) sāk darboties")
    }

    deinit {
        print("\(name) beidz darboties")
    }
}

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

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) sāk darboties")
    }

    deinit {
        print("Apartment \(unit) beidz darboties")
    }
}

Piemērs unowned izmantošanai, fiksējot self slēdzienā:

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

    lazy var asHTML: () -> String = {
        [unowned self] in // unowned self, lai novērstu cikla veidošanos
        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) beidz darboties")
    }
}