Junior — Middle
Koja je razlika između Weak i Unowned referenci u upravljanju memorijom?
sobes.tech АИ
Одговор од АИ
U Swift-u, reference tipovi weak i unowned koriste se za sprečavanje ciklusa jakih referenci (retain cycles) u upravljanju memorijom, ali se razlikuju po ponašanju i primeni.
-
Weak (slaba referenca):
- Može biti
nil. - Deklariše se kao opcionalni tip (
var delegate: SomeDelegate? weak). - Koristi se kada referenca može postati
niltokom životnog veka objekta, na primer, delegati. - Sistem automatski postavlja
weakreferencu nanilkada referencirani objekat bude oslobođen.
- Može biti
-
Unowned (bez vlasnika):
- Ne može biti
nil(neopcionalni tip). - Koristi se kada referenca garantovano postoji tokom celog životnog veka objekta, na primer, između roditelja i deteta.
- Ako je referencirani objekat već oslobođen, pokušaj pristupa će izazvati grešku u izvršenju (crash).
- Ne može biti
Primer:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Ovde je tenant unowned, jer stan ne može postojati bez stanara.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegat je weak, jer može biti oslobođen ranije.
Dakle, weak je pogodan za reference koje mogu postati nil, a unowned za one koje uvek moraju biti važeće tokom životnog veka objekta.