NSURLSession HTTP / 2内存泄漏

时间:2016-09-09 10:22:43

标签: ios memory-leaks nsurlsession http2 nsurlsessiondatatask

这个My Test案例指出,当使用带有HTTP / 2连接的NSURLSession时,存在内存问题。

test1:iOS 9. HTTP / 2服务器

我使用NSURLSession将10M文件上传到HTTP / 2服务器,如果上传的文件完成一切正常,但如果我在完成之前取消上传任务,10M将永远不会释放。

test2:iOS 9. HTTPs1.1服务器

我用https1.1文件服务器测试相同的代码,我是否取消上传任务,一切正常,内存恢复正常。(10M数据发布)

test3 iOS 8. HTTP / 2服务器

这种情况一切正常。(NSURLSession没有协议协商到HTTP / 2)

所以,即使有一些不适合我使用NSURLSession的东西,NSURLSession的性能也不适用于HTTP / 2.

除了内存问题,当使用带有HTTP / 2的NSURLSession上传文件时,进度段大小很大(一次回调可能是5M'addSendBodyData')

我也读过this page。 SSL可以缓存一些东西,但不应该缓存整个文件。(当我取消任务或请求超时时,10M文件大小的内存泄漏)

任何人都知道导致问题的原因,可以给我一些帮助。 谢谢。

问题更新0912:添加测试项目链接

测试项目:https://github.com/upyun/swift-sdk/tree/testleak

file:UPUtils.swift
//Change the url to make comparison test. 

//let DEFAULT_UPYUN_FORM_API_DOMAIN = "http://v0.api.upyun.com"//http1.1
//let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://httpbin.org/post" //https1.1
let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://v0.api.upyun.com"//http2

1 个答案:

答案 0 :(得分:1)

来自apple doc:

  

会话对象保留对委托的强引用,直到您的应用退出或显式使会话无效为止。如果您没有使会话无效,那么您的应用程序会在内存泄漏之前泄漏内存。

同时查看您的项目https://github.com/upyun/swift-sdk/tree/testleak,您需要在sessionTask.resume()之后调用finishTasksAndInvalidate(),因为您正在为每个请求创建会话