首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >URLSessionDelegate类deinit未调用

URLSessionDelegate类deinit未调用
EN

Stack Overflow用户
提问于 2021-08-21 22:59:12
回答 2查看 133关注 0票数 1

对于客户端证书身份验证,我必须在自定义类中使用URLSessionDelegate来处理所有请求。问题是类在发出请求后不会重新初始化。

代码:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-21 23:44:01

URLSession保持对其委托的强烈引用(在您的情况下是self)。检查正式文件

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

您可以使用它的方法finishTasksAndInvalidate()invalidateAndCancel()使会话无效。在此之后,URLSession将发布对其委托的强引用。

我想您的代码示例只是为了演示行为,但无论如何,我必须提到,为每个创建一个新的URLSession并不是一个好的实践。

票数 1
EN

Stack Overflow用户

发布于 2021-08-21 23:23:55

request()中,当将self分配给委托时,您将创建对类实例的强引用。这将导致保留周期,并停止重新初始化实例。答案是每周捕获委托:

代码语言:javascript
复制
URLSession(configuration: config, delegate: self, delegateQueue: .main).dataTask(with: url) { [weak self] (data, response, error) in
            
            print("Received")
            
        }.resume()

在没有委托的request2()中,这种情况显然不会发生。

这里有很多关于这方面的博客和教程,所以我不会重复这些博客和教程,我会让你在谷歌上搜索关于捕获列表和强与弱引用的细节:-)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68877323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档