我已經通過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字節
控制器deinitializer ...
的WebServices deinitializer ...
我的問題是,即使我正在使用self
直接關閉爲什麼這個實施我s不會導致參考保留週期?
如果我使用unowned
或weak
那麼也是同樣的行爲。
什麼能引起參考上面的場景中保留週期?(我不希望引起,而是想知道錯誤的)
即使這種情況下,與異步還兼具實例去初始化! – D4ttatraya
@DashAndRest編輯,我的錯誤,現在它是'UIViewContoller'類似的行爲,'解僱'而不是'nil'的例子 – JuicyFruit
但是,這仍然是如何初始化?以及它如何泄漏內存? – D4ttatraya