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.