Sobes.tech
Junior — Middle

Kokiu atveju yra geriausia naudoti weak arba unowned atminties valdymui kūrėjų komandoje?

sobes.tech AI

Atsakymas iš AI

iOS, norint valdyti atmintį naudojant ARC (Automatinis nuorodų skaitiklis), naudojamos silpnos (weak) ir nesaugios (unowned) nuorodos, siekiant išvengti objektų išlaikymo ciklų.

  • weak naudojama, kai nuoroda gali tapti nil tam tikru momentu, tai yra, objektas, į kurį ji nuorodoja, gali būti ištrintas. Silpna nuoroda automatiškai nustatoma į nil, kai objektas yra laisvinamas. Tai tinka, kai ryšys nėra privalomas ir objektas gali išnykti.

  • unowned naudojama, kai nuoroda visada turi nurodyti į esantį objektą ir negali būti nil. Jei objektas bus laisvintas, o unowned nuoroda liks, tai sukels klaidą vykdymo metu. Paprastai, unowned naudojama, kai nuorodą turinčio objekto gyvavimo ciklas garantuotai yra ilgesnis nei nuorodos savininko.

Pavyzdys:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent? // weak, nes tėvas gali būti ištrintas anksčiau
}

// Arba

class Customer {
    let card: CreditCard
    init() {
        card = CreditCard(customer: self)
    }
}

class CreditCard {
    unowned let customer: Customer // unowned, nes korta negali egzistuoti be kliento
    init(customer: Customer) {
        self.customer = customer
    }
}

Santrauka:

  • Naudokite weak, kai nuoroda gali tapti nil ir norite išvengti išlaikymo ciklų.
  • Naudokite unowned, kai nuoroda visada turi būti galiojanti ir objektas egzistuoja ilgiau nei nuoroda.