Sobes.tech
Junior — Middle

Kokiais atvejais geriau naudoti unowned vietoj weak atminties valdyme?

sobes.tech AI

Atsakymas iš AI

Swift'e weak ir unowned naudojami stiprių nuorodų ciklų išvengimui, tačiau jie taikomi skirtingose situacijose:

  • weak yra pasirinktinė nuoroda, kuri automatiškai tampa nil, kai nuoroda į objektą yra išlaisvinama. Ji naudojama, kai nuoroda gali tapti nil objekto gyvavimo metu.

  • unowned yra nepasirinktinė nuoroda, kuri daro prielaidą, kad nuoroda į objektą visada egzistuos naudojimo metu. Jei objektas bus išlaisvintas, prieiga prie unowned sukels vykdymo klaidą.

Rekomenduojama naudoti unowned, kai:

  • Nuoroda visada turi rodyti į esantį objektą (pavyzdžiui, tėvo objektas, kuris gyvena ilgiau nei vaikas).
  • Esate tikras, kad nuorodos objekto gyvavimo trukmė nebus trumpesnė nei nuorodos gyvavimo trukmė.

Pavyzdys:

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)

Čia, CreditCard turi unowned nuorodą į Customer, nes korta negali egzistuoti be kliento, o klientas gyvena ilgiau nei korta.