完成处理程序导致不调用 deinit

Completion Handler Causes Deinit To Not Be Called

我有一个包含完成处理程序的网络任务,允许我确定任务是否以及何时成功完成;

func performUpload(url: URL, completionHandler: @escaping (_ response: Bool) -> ()) {
    photoSave.savePhotoRemote(assetURL: url) { response in
        completionHandler(response)
    }
}

我使用以下代码从另一个 UIView 调用此函数;

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

我注意到的是,当我捕获 responsedo stuff 时,调用此函数的 class永远不会取消。但是,如果我将函数更改为以下内容;

UploadHelper.shared.performUpload(url: fileAssetPath) { response in }

不要对响应做任何事情,class 将取消初始化。

我的函数做错了什么?我想相应地捕获响应,但不以我的 class 未从内存中释放为代价。

你有一个保留周期。打破它。变化

UploadHelper.shared.performUpload(url: fileAssetPath) { response in
    if response {
       // do stuff
    }
}

UploadHelper.shared.performUpload(url: fileAssetPath) { [unowned self] response in
    if response {
       // do stuff
    }
}