Koja je razlika između slabih i jakih veza?
sobes.tech АИ
Одговор од АИ
Razlika u mehanizmu upravljanja memorijom (ARC - Automatsko brojanje referenci).
-
Jaka referenca (Strong reference): Povećava brojač referenci objekta za 1. Objekat ne može biti oslobođen iz memorije dok postoji bar jedna jaka referenca na njega. Ovo ponašanje je podrazumevano za svojstva i promenljive u Swift-u.
-
Slaba referenca (Weak reference): Ne povećava brojač referenci objekta. Koristi se za sprečavanje cikličnih referenci, kada dva ili više objekata imaju jake reference jedan na drugog, što stvara curenje memorije. Slabe reference su uvek opcionalne (
Optional), jer objekat na koji se odnose može biti deallociran u bilo kom trenutku. Kada je objekat oslobođen, slaba referenca automatski postajenil.
Primer ciklične reference i njenog sprečavanja pomoću slabe reference:
class Person {
let name: String
var apartment: Apartment? // Početno jaka referenca
init(name: String) { self.name = name }
deinit { print("\(name) se oslobađa") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Slaba referenca
init(unit: String) { self.unit = unit }
deinit { print("Stan \(unit) se oslobađa") }
}
var john: Person? // Instanca osobe
var unit4A: Apartment? // Instanca stana
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Kreiranje ciklične jake reference:
// john ima jaku referencu na stan
// stan ima jaku referencu na osobu
john!.apartment = unit4A
unit4A!.tenant = john // Ovo mora biti slaba referenca da prekine ciklus
john = nil // Postavljanje na nil neće ga deallocirati ako ciklus postoji
unit4A = nil // Postavljanje na nil neće ga deallocirati ako ciklus postoji
// Očekivani ispis pri korišćenju slabe reference za zakupca:
// John Appleseed se oslobađa
// Stan 4A se oslobađa
Bez weak za tenant, destruktori ne bi bili pozvani, što ukazuje na curenje memorije.