ios - 未调用 URLSessionDelegate 类 deinit
问题描述
对于客户端证书身份验证,我必须URLSessionDelegate
在自定义类中使用来处理所有请求。问题是在发出请求后类没有被取消初始化。
代码:
class Request: NSObject, URLSessionDelegate, URLSessionTaskDelegate{
func request(){
let url:URL = URL(string: "https://stackoverflow.com")!
let config = URLSessionConfiguration.default
URLSession(configuration: config, delegate: self, delegateQueue: .main).dataTask(with: url) { (data, response, error) in
print("Received")
}.resume()
}
func request2(){
let url:URL = URL(string: "https://stackoverflow.com")!
let config = URLSessionConfiguration.default
URLSession(configuration: config).dataTask(with: url) { (data, response, error) in
print("Received")
}.resume()
}
deinit {
print("Class deinit...")
}
}
调用Request().request()
then时deinit
不调用。Request().request2()
然后调用deinit
调用。
我不知道如何解决这个问题。请帮我找出解决方案。谢谢...
解决方案
URLSession
强烈引用其代表(self
在您的情况下)。查看官方文档:
会话对象保持对委托的强引用,直到您的应用退出或显式使会话无效。如果您不使会话无效,您的应用程序会泄漏内存,直到应用程序终止。
您可以使用其方法finishTasksAndInvalidate()
或invalidateAndCancel()
. 之后 URLSession 将释放对其委托的强引用。
我猜你的代码示例只是为了演示行为,但无论如何我不得不提到为每个 URLRequest创建一个新的 URLSession 不是一个好习惯。
推荐阅读
- php - 如何在嵌套数组中添加数组(PHP Mongodb)
- spring-integration - Spring集成Logging消息通道ID
- java - 使用流基于另一个列表更新一个列表
- java - NXP NFC NDEF 标签内存大小问题
- abap - 在 UDM_DISPUTE 中检索模板时缓存的值
- javascript - webpack-dev-server 热重载不起作用?
- python - python 3 txt文件数字签名和验证
- angular - Angular 6 事件发射器 - 不起作用
- batch-file - 在批处理文件中将变量传递给 cURL
- python - ModuleNotFoundError:没有名为“google”的模块