Sobes.tech
Junior

Kas yra weak atminties modifikatorius Swift?

sobes.tech AI

Atsakymas iš AI

weak modifikatorius naudojamas nutraukti stiprių nuorodų ciklus (reference cycles) tarp objektų, kai vienas objektas turi stiprią nuorodą į kitą, o tas grįžta su stipriąja nuoroda.

Pagrindinės weak savybės:

  • Nekelia nuorodų skaičiaus: Naudojant weak, nesikeičia stiprių nuorodų skaičius į objektą.
  • Gali būti nil: Silpna nuoroda yra pasirenkama (Optional) ir automatiškai tampa nil, kai objektas, į kurį ji nurodo, yra deinitializuojamas.
  • Naudojama tėvo/vaiko santykiams: Dažnai taikoma, kai vaiko objektas turi nuorodą į savo tėvą, siekiant išvengti stiprių nuorodų ciklo.
  • Reikalauja deklaruoti kaip var: Kadangi silpna nuoroda gali tapti nil, ji turi būti kintama (var), o ne konstanta (let).

Pavyzdys:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) yra inicijuojamas")
    }

    deinit {
        print("\(name) yra deinitializuojamas")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Silpna nuoroda

    init(unit: String) {
        self.unit = unit
        print("Butas \(unit) yra inicijuojamas")
    }

    deinit {
        print("Butas \(unit) yra deinitializuojamas")
    }
}

Be weak var tenant: Person? Apartment klasėje būtų stiprių nuorodų ciklas, ir Person bei Apartment egzemplioriai nebūtų deinitializuojami, kai jų daugiau niekas nelaiko stipriomis nuorodomis. Dėl weak, kai Person egzempliorius deinitializuojamas, nuoroda tenant Apartment egzemplioriuje automatiškai tampa nil.