Junior — Middle
Mohou nastat potíže nebo neočekávané chování, pokud se jedno z vnitřních uzávěrů třídy dostane k jejím metodám nebo vlastnostem?
sobes.tech AI
Odpověď od AI
Ano, při používání uzávěrů (closures) uvnitř třídy v Swiftu mohou nastat potíže související se zachycením self a možnými cykly udržování (retain cycles).
Pokud uzávěr zachytí self bez použití slabé ([weak self]) nebo nepojmenované ([unowned self]) reference, může to vést k tomu, že instance třídy nebude uvolněna z paměti, protože uzávěr drží silnou referenci na self, a self může držet uzávěr.
Příklad problému:
class MyClass {
var closure: (() -> Void)?
var value = 10
func setupClosure() {
closure = {
print(self.value) // zachycení self
}
}
deinit {
print("MyClass byl uvolněn")
}
}
var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass nebude uvolněn kvůli cyklu udržování
Abychom se tomu vyhnuli, používá se slabá reference:
closure = { [weak self] in
guard let self = self else { return }
print(self.value)
}
Je tedy důležité pečlivě spravovat zachycení self v uzávěrech uvnitř tříd, aby se předešlo únikům paměti a neočekávanému chování.