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