Sobes.tech
Junior — Middle

Millistel juhtudel on eelistatav kasutada unowned asemel weak'i mäluhalduses?

sobes.tech AI

Vastus AI-lt

Swiftis kasutatakse weak ja unowned, et vältida tugevaid viidete tsükleid, kuid need rakenduvad erinevates olukordades:

  • weak on valikuline viide, mis automaatselt muutub nil, kui viidatud objekt vabastatakse. Seda kasutatakse siis, kui viide võib objekti eluea jooksul muutuda nil-iks.

  • unowned on mitte-valikuline viide, mis eeldab, et viidatud objekt eksisteerib alati selle viite kasutamise ajal. Kui objekt vabastatakse, põhjustab unowned-ile juurdepääs jooksva veaga.

Soovitatav on kasutada unowned, kui:

  • Viide peab alati osutama olemasolevale objektile (näiteks vanemobjekt, mis elab kauem kui laps).
  • Olete kindel, et viidatud objekti eluea pikkus ei ole lühem kui viite eluaeg.

Näide:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)

Siin on CreditCard omanik unowned viide Customer-ile, sest kaart ei saa eksisteerida ilma kliendita, ja klient elab kauem kui kaart.