首页 > 解决方案 > 未调用 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调用。

我不知道如何解决这个问题。请帮我找出解决方案。谢谢...

标签: iosswifturlsession

解决方案


URLSession强烈引用其代表(self在您的情况下)。查看官方文档

会话对象保持对委托的强引用,直到您的应用退出或显式使会话无效。如果您不使会话无效,您的应用程序会泄漏内存,直到应用程序终止。

您可以使用其方法finishTasksAndInvalidate()invalidateAndCancel(). 之后 URLSession 将释放对其委托的强引用。

我猜你的代码示例只是为了演示行为,但无论如何我不得不提到为每个 URLRequest创建一个新的 URLSession 不是一个好习惯。


推荐阅读