Junior — Middle
Kas võivad tekkida raskused või ootamatud käitumised, kui klassi sees olev üks selle sulgemistest pääseb ligi selle meetoditele või omadustele?
sobes.tech AI
Vastus AI-lt
Jah, kasutades sulgus (closures) Swift klassi sees, võivad tekkida raskused, mis on seotud self haaramise ja võimalike säilitussüklitega (retain cycles).
Kui sulg haarab self ilma kasutamata nõrka ([weak self]) või nimetamata ([unowned self]) viidet, võib see põhjustada selle, et klassi eksemplar ei vabastata mälust, kuna sulg hoiab tugevat viidet self-le ning self võib hoida sulgu.
Probleemi näide:
class MyClass {
var closure: (() -> Void)?
var value = 10
func setupClosure() {
closure = {
print(self.value) // haarab `self`
}
}
deinit {
print("MyClass on deinitialiseeritud")
}
}
var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass ei vabastata säilitussüsti tõttu
Selle vältimiseks kasutatakse nõrka viidet:
closure = { [weak self] in
guard let self = self else { return }
print(self.value)
}
Seega on oluline hoolikalt hallata self haaramist klasside sees, et vältida mälulekkeid ja ootamatut käitumist.