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:
unownedtiek izmantots, kad atsauces objekts ir tāds pats vai ilgāks dzīves cikls.weaktiek izmantots, kad atsauces objekts var tikt deallocēts agrāk. - Optional:
unownednav Optional (izņemot, ja tas ir deklarēts kāunowned optional).weakvienmēr ir Optional. - Drošība: Piekļuvei
unownedatsaucei uz jau deallocētu objektu radīs crash. Piekļuveiweakatsaucei tiks atgrieztsnil.
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.