Вот еще один «пример», который выходит за пределы игровой площадки, чтобы продемонстрировать цикл сохранения с закрытием:
class ClosureClassStrongRefCycle {
let str : String
lazy var printStr: () -> () = { // self is captured
print("\(self.str)")
}
init(str: String) {
self.str = str
}
deinit {
print("ClosureClassStrongRefCycle is being deallocated")
}
}
Теперь, когда вы звоните своему классу так:
do {
let myClassWithClosureStrongCycle = ClosureClassStrongRefCycle(str: "closure class strong cycle")
myClassWithClosureStrongCycle.printStr()
} // 'myClassWithClosureStrongCycle' is NEVER deallocated -> Strong reference cycle between this class and it's closure
экземпляр ClosureClassStrongRefCycle
сохраняет себя, потому что закрытие внутри него сохраняет self
наконец, если вы хотите избавиться от цикла сохранения, вы можете добавить unowned self
следующим образом:
lazy var printStr: () -> () = { [unowned self] in // Unowned copy of self inside printStr
print("\(self.str)")
}