【发布时间】:2017-06-13 08:35:11
【问题描述】:
我经历了Swift Closures 和ARC in Swift,我有点困惑。
我有调用 Web 服务和使用响应数据的简单场景。
这是我的基本实现:
class WebServices: NSObject {
func requestDataFromServer(completion: @escaping (_ data: Data?) -> Void) {
//web service call here
completion(Data())
}
deinit {
print("WebServices deinitializer...")
}
}
class Controller: NSObject {
private let webService = WebServices()
private func useResponseData(_ data: Data) {
print("Response Data: \(data)")
}
func fetchData() {
webService.requestDataFromServer { (data) in
if let responseData = data {
self.useResponseData(responseData)//direct use of self
}
}
}
deinit {
print("Controller deinitializer...")
}
}
var controller: Controller? = Controller()
controller!.fetchData()
controller = nil
控制台输出是:
响应数据:0 字节
控制器去初始化器...
WebServices deinitializer...
我的问题是即使我在闭包内直接使用self,为什么这个实现不会导致参考保留周期?
如果我使用unowned 或weak,那么也是同样的行为。
在上述情况下,什么会导致引用保留循环?(我不想引起,而是想知道错误)
【问题讨论】:
标签: swift closures self-reference