Sobes.tech
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.