使用 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

如何使用 AFHTTPSessionManager 访问 422 上的响应正文?

2 AFHTTPSessionManager

AFHTTPSessionManager 标头