只要我不注释掉下面的函数,我的AchievementViewController
就不会从内存中被释放
NetworkConnection.achievementList(for: -1) { [weak self] response in
guard let sections = response.object as? [AchievementListSection] else {
return print("Network failure")
}
self?.sections = sections
self?.configureCollectionView()
}
这个函数的定义如下,在目前,我们只是使用一个延迟的异步调用来发送一个存根化的响应。
static func achievementList(for identifier: Int64, responseHandler: RequestResponseClosure?) {
let stubResponse = ResponseObject(object: AchievementListSection.exampleList as NSArray, code: .success)
let randomDelayMilliseconds = Int(arc4random_uniform(1000))
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomDelayMilliseconds)) {
responseHandler?(stubResponse)
}
}
在这里,self被保留在哪里以创建一个循环呢?它被作为弱引用传递给NetworkConnection闭包,当这个闭包传递给DispatchQueue
后,我期望它会在延迟过后释放。
weak self
这一事实应该可以防止任何achievementList
实现方式产生保留循环。你确定这个闭包是有问题的吗?该问题不可能从其他地方开始吗? - Cristik