Junior — Middle
Могу ли настати потешкоће или неочекивано понашање ако једна од унутрашњих затварања у класи приступи њеним методама или својствима?
sobes.tech АИ
Одговор од АИ
Da, prilikom korišćenja zatvarača (closures) unutar klase u Swift-u, mogu se pojaviti poteškoće povezane sa hvatanjem self i mogućim ciklusima zadržavanja (retain cycles).
Ako zatvarač uhvati self bez korišćenja slabog ([weak self]) ili neimenovanog ([unowned self]) referenciranja, to može dovesti do toga da instanca klase neće biti oslobođena iz memorije, jer zatvarač drži jaku referencu na self, a self može držati zatvarač.
Primer problema:
class MyClass {
var closure: (() -> Void)?
var value = 10
func setupClosure() {
closure = {
print(self.value) // hvatanje self
}
}
deinit {
print("MyClass je deinitializovan")
}
}
var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass neće biti deinitializovan zbog ciklusa zadržavanja
Da biste to izbegli, koristite slab referencu:
closure = { [weak self] in
guard let self = self else { return }
print(self.value)
}
Stoga je važno pažljivo upravljati hvatanjem self u zatvaračima unutar klasa kako biste izbegli curenje memorije i neočekivano ponašanje.