Sobes.tech
Junior — Middle

Môžu nastať ťažkosti alebo neočakávané správanie, ak sa jedno z vnútorných uzáverov triedy dostane k jej metódam alebo vlastnostiam?

sobes.tech AI

Odpoveď od AI

Áno, pri používaní uzávierok (closures) v rámci triedy v Swiftu môžu nastať ťažkosti súvisiace so zachytením self a možnými cyklami udržiavania (retain cycles).

Ak uzávierok zachytí self bez použitia slabého ([weak self]) alebo nepojmenovaného ([unowned self]) odkazovania, môže to viesť k tomu, že inštancia triedy nebude uvoľnená z pamäti, pretože uzávierok udržiava silnú referenciu na self, a self môže udržiavať uzávierok.

Príklad problému:

class MyClass {
    var closure: (() -> Void)?
    var value = 10

    func setupClosure() {
        closure = {
            print(self.value) // zachytenie self
        }
    }

    deinit {
        print("MyClass bol uvoľnený")
    }
}

var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass nebude uvoľnený kvôli cyklu udržiavania

Na jeho zabránanie sa používa slabá referencia:

closure = { [weak self] in
    guard let self = self else { return }
    print(self.value)
}

Je teda dôležité starostlivo spravovať zachytenie self v uzávierkach v triedach, aby ste predišli únikom pamäti a neočakávanému správaniu.