我有这个代码,我在质疑是否需要使用捕获列表来引用self
弱的引用。
现在我认为getTextFileData
和.main.async
是静态方法,因此,这不会导致保留周期。但是,我确实访问games
属性,有点不确定。
NPWebService.getTextFileData { (games, success) in
if success {
self.games = games
DispatchQueue.main.async {
self.updateUI()
}
}
}
答案 0 :(得分:5)
这不会导致保留循环,因为它看起来像是不同类型的静态方法。因此getTextFileData
方法将暂时保留您传入的闭包,直到任何异步工作完成,并且闭包将暂时保留self。但是当工作完成并且关闭完成后,这些临时保留将到期,并且自动内存管理可以适当地清理。
保留周期的危险在于你有一个引用/捕获self的闭包,而self也会保留闭包。像这样:
class GameController {
var games: [Game]?
// self retains the closure as a property
let updateClosure:([Game], Bool)->() = {
games, success in
if success {
self.games = games // and the closure captures self. Each retains each other indefinitely, this is a retain cycle and neither this closure nor self will ever be deallocated
}
}
func load() {
NPWebService.getTextFileData(updateClosure)
}
}
通常只需要关闭捕获列表中的弱自我或无主自我: