Sobes.tech
Junior

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 postaje nil.

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.