Sobes.tech
Middle

Kāda ir neapzināto atsauces veida?

sobes.tech AI

Atbilde no AI

unowned atsauces ir nepieciešamas, lai atrisinātu cikliskās atsauces (retain cycles) starp objektiem, kad abi atsauces ir stipras, bet viens no objektiem ir īsāks vai vienāds dzīves cikls ar otru.

unowned tiek izmantots, kad ir zināms, ka atsauces objekts nebūs nil visa objekta dzīves laikā, kas satur atsauci. Atšķirībā no weak, piekļuvei unowned atsaucei netiek izmantots Optional. Ja objekts, uz kuru norāda unowned, tiks deallocēts pirms objekta ar unowned atsauci, notiks crash.

Piemērs lietošanai slēdžos:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) tiek inicializēts")
    }

    deinit {
        print("\(name) tiek deinitializēts")
    }
}

class Apartment {
    let unit: String
    // Izmantojam `unowned`, jo ir zināms, ka
    // Apartment nevar pastāvēt bez Person
    // (šajā kontekstā). Person var būt nil,
    // bet ja Apartment pastāv, tad arī Person pastāv.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Apartment \(unit) tiek inicializēts")
    }

    deinit {
        print("Apartment \(unit) tiek deinitializēts")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// Šajā piemērā, tenant var būt nil, tāpēc `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// Izbeidzam stiprās atsauces, lai pārbaudītu deallocāciju
john = nil
unit4A = nil

Šajā piemērā, Person ir stipra atsauce uz Apartment (var apartment: Apartment?). Apartment varētu būt stipra atsauce uz Person, kas radītu ciklu. Tomēr, ņemot vērā, ka šajā kontekstā Apartment loģiski nevar pastāvēt bez Person (kurš to īrē), atsauce no Apartment uz Person tiek veikta ar unowned. Tādējādi, kad iestatām john = nil, Person tiek deallocēts, un tā kā nav stipru atsauču uz Apartment, tas arī tiek deallocēts.

Galvenās atšķirības no weak:

  • Dzīves cikls: unowned tiek izmantots, kad atsauces objekts ir tāds pats vai ilgāks dzīves cikls. weak tiek izmantots, kad atsauces objekts var tikt deallocēts agrāk.
  • Optional: unowned nav Optional (izņemot, ja tas ir deklarēts kā unowned optional). weak vienmēr ir Optional.
  • Drošība: Piekļuvei unowned atsaucei uz jau deallocētu objektu radīs crash. Piekļuvei weak atsaucei tiks atgriezts nil.

Tātad, unowned ir ne-īpašuma (non-owning) atsauce, kas tiek izmantota, kad ir garantija, ka atsauces objekts pastāvēs tik ilgi, kamēr pastāvēs objekts ar unowned atsauci.