对于客户端证书身份验证,我必须在自定义类中使用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()时,不调用deinit。调用Request().request2(),然后调用deinit。
我不知道如何解决这个问题。请帮我找出解决办法。谢谢..。
发布于 2021-08-21 23:44:01
URLSession保持对其委托的强烈引用(在您的情况下是self)。检查正式文件
会话对象保持对委托的强烈引用,直到应用程序退出或显式地使会话无效。如果不使会话无效,则应用程序会泄漏内存,直到应用程序终止为止。
您可以使用它的方法finishTasksAndInvalidate()或invalidateAndCancel()使会话无效。在此之后,URLSession将发布对其委托的强引用。
我想您的代码示例只是为了演示行为,但无论如何,我必须提到,为每个创建一个新的URLSession并不是一个好的实践。
发布于 2021-08-21 23:23:55
在request()中,当将self分配给委托时,您将创建对类实例的强引用。这将导致保留周期,并停止重新初始化实例。答案是每周捕获委托:
URLSession(configuration: config, delegate: self, delegateQueue: .main).dataTask(with: url) { [weak self] (data, response, error) in
print("Received")
}.resume()在没有委托的request2()中,这种情况显然不会发生。
这里有很多关于这方面的博客和教程,所以我不会重复这些博客和教程,我会让你在谷歌上搜索关于捕获列表和强与弱引用的细节:-)
https://stackoverflow.com/questions/68877323
复制相似问题