Junior — Middle
Mi a különbség a Weak és Unowned típusú hivatkozások között a memória kezelésében?
sobes.tech MI
Válasz az MI-től
Swiftben a weak és unowned típusú hivatkozásokat a memória kezelésében az erős hivatkozási ciklusok (retain cycles) megelőzésére használják, de viselkedésük és alkalmazásuk szerint különböznek.
-
Weak (gyenge hivatkozás):
nillehet.- Opcionális típusként van deklarálva (
var delegate: SomeDelegate? weak). - Akkor használják, amikor a hivatkozás az objektum életciklusa során
nil-ré válhat, például delegáltaknál. - A rendszer automatikusan
nil-re állítja aweakhivatkozást, amikor a hivatkozott objektum felszabadul.
-
Unowned (tulajdonos nélküli):
- Nem lehet
nil(nem opcionális típus). - Akkor használják, amikor a hivatkozás garantáltan létezik az objektum életciklusa során, például szülő és gyermek között.
- Ha a hivatkozott objektum már felszabadult, a hozzáférés futási hibát (összeomlást) okoz.
- Nem lehet
Példa:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Itt a tenant unowned, mivel egy lakás nem létezhet bérlő nélkül.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// A delegált weak, mivel korábban felszabadulhat.
Tehát, a weak alkalmas olyan hivatkozásokra, amelyek nil-ré válhatnak, míg az unowned olyan hivatkozásokra, amelyeknek mindig érvényesnek kell lenniük az objektum életciklusa során.