Sobes.tech
Middle+

Kako napraviti slabu referencu na polje koje je protokol?

sobes.tech АИ

Одговор од АИ

Možete koristiti ključne reči weak ili unowned pre deklaracije polja protokolnog tipa.

protocol MyProtocol: AnyObject { // Protokol treba biti ograničen na klase
    func doSomething()
}

class MyClass {
    weak var delegate: MyProtocol? // Slaba referenca na polje tipa MyProtocol
    unowned var helper: MyProtocol // Neposednička referenca na polje tipa MyProtocol (ako ste sigurni da objekat uvek postoji)
}

Važno je napomenuti da protokol mora biti ograničen na klase (: AnyObject) da bi se mogle koristiti slabe ili neposedničke reference. To garantuje da tip koji implementira protokol bude referentni tip, a ne vrednosni tip.

Za polje protokolnog tipa, weak se primenjuje kada objekat na koji se odnosi polje može biti oslobođen ranije nego objekat koji sadrži tu referencu. Ako se referencirani objekat oslobodi, polje automatski postaje nil.

unowned se koristi kada ste sigurni da objekat na koji se odnosi polje uvek ima isti ili duži životni ciklus od objekta koji sadrži tu referencu. Korišćenje unowned je sigurno samo ako garantujete odsustvo cikličnih referenci i ako ste sigurni da je referencirani objekat uvek validan. Ako se objekat oslobodi, a pokušate da mu pristupite putem unowned reference, doći će do pada.

U većini slučajeva, weak se koristi za delegatore i druge slične obrasce.