使用 AFHTTPSessionManager 时的内存泄漏
Posted
技术标签:
【中文标题】使用 AFHTTPSessionManager 时的内存泄漏【英文标题】:Memory leak when use AFHTTPSessionManager 【发布时间】:2019-11-27 10:34:00 【问题描述】:环境:
-
ios 13/iOS 10
Xcode 11.1
AFNetworking 版本:3.2.1
斯威夫特 4.2
说明: 使用 AFNetworking 发布或获取 Json 数据时,会导致内存泄漏,我这样创建一个 AFHTTPSessionManager:
private static func ConfigureAFManager(requestSerialization: HttpSerializationType = HttpSerializationType.HTTP,
responseSerialization: HttpSerializationType = HttpSerializationType.JSON,
timeout: TimeInterval = 30,
headers: [String: String]? = nil
) -> AFHTTPSessionManager
let AFManager = AFHTTPSessionManager()
if requestSerialization == .JSON
AFManager.requestSerializer = AFHTTPRequestSerializer()
if responseSerialization == .HTTP
AFManager.responseSerializer = AFHTTPResponseSerializer()
for (key, value) in headers ?? [:]
AFManager.requestSerializer.setValue(value, forHTTPHeaderField: key)
AFManager.requestSerializer.timeoutInterval = timeout;
return AFManager
然后我用它来执行发布操作:
static func POST(httpURL: String,
parameter: Any?,
timeout: TimeInterval = 30,
headers: [String: String]? = nil,
requestSerialization: HttpSerializationType = HttpSerializationType.HTTP,
responseSerialization: HttpSerializationType = HttpSerializationType.JSON,
success: ((Any?) -> Void)?,
fail: ((Error?) -> Void)?) -> Void
let AFManager = self.ConfigureAFManager(requestSerialization: requestSerialization, responseSerialization: responseSerialization, timeout: timeout, headers: headers)
AFManager.post(httpURL, parameters: parameter, progress: nil, success: (task, response) in
success?(response)
) (task, error) in
fail?(error)
当我点击Xcode上的Debug Memory Graph
时,我发现AFHTTPSessionManager
和__NSURLSessionLocal
之间有一些循环引用。
Cycle reference 这只发生在 3.2.1 版本的 AFNetworking 中吗?
【问题讨论】:
【参考方案1】:我知道为什么,因为 AFNetWorking 使用 URLSession 它的委托会建立一个强引用,所以在使用 AFHttpSessionManager 之后应该调用 invalidateSessionCancelingTasks
【讨论】:
以上是关于使用 AFHTTPSessionManager 时的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 AFHTTPSessionManager 发送 POST 请求时向参数发送空白数据
使用 AFHTTPSessionManager 时的内存泄漏
AFNetworking 2.0 AFHTTPSessionManager