ios - 如何快速避免 AFNetworking 导致的内存泄漏

标签 ios swift memory-leaks afnetworking-3

我在我的项目中使用 AFNetworking。当我尝试使用仪器查找内存泄漏时,它显示 AFNetworking 是内存泄漏的原因。我正在创建一个模型类,并在该类中调用 AFNetworking。对 API 的调用是从 Viewcontroller 到模型类完成的。请帮助我如何解决此问题。

我的编码模式正在下面添加。

Class myViewController:UIViewcontroller{

 override func viewDidLoad() {
        super.viewDidLoad()
     //apiCall
     myModel.apiCallFuncT("value"){ (success) in

       }

     }
}



Class myModel{

var somevariable:String

class apiCallFuncT(parameters:string,completionHandler:@escaping(_ success:Bool)->Void){

//here Im calling the AFNetworking class. Im adding the call below.

 ServiceManager.getDataFromNewServiceSolOne(serviceName: URL  + "\(apiName)", parameters: param , success: { (result) in

         completion(true)


        })
}



//This is the serviceManger I'm calling from all models I have for api Calls.
class ServiceManager: NSObject {

    static var sharedManager = AFHTTPSessionManager()

    class func getDataFromNewServiceSolOne(serviceName: String, parameters : [String : String]?, success:@escaping (_ result: AnyObject) -> Void, failure :@escaping (_ error : NSError) -> Void) {

        let manager = AFHTTPSessionManager(baseURL: NSURL(string: URL)! as URL)
        manager.responseSerializer.acceptableContentTypes = ["text/html", "application/json"]
        manager.post(serviceName, parameters: parameters, progress: { (progress) in
        }, success: { (task, result) in
            success(result as AnyObject)
        }) { (task, error) in
            failure(error as NSError)
        }
    }
}

最佳答案

为了诊断这些问题,带有“Malloc Stack”选项的“调试内存图”功能是我们使用的第一个工具。请参阅How to debug memory leaks when Leaks instrument does not show them?

enter image description here

无论如何,当我们运行它时,我们可以看到问题不在于您对 API 的使用。您的代码中没有任何强引用循环。在此示例中,我们在左侧面板中看不到任何应用程序的对象(应用程序和场景委托(delegate)除外)(因为我关闭了发起请求的自定义 View Controller )。太好了。

所以,这是怎么回事?问题是AFHTTPSessionManager之间的循环。及其 NSURLSession 。与大多数代表不同,NSURLSession对其代表保持强引用。如the documentation说:

The session object keeps a strong reference to this delegate until your app exits or explicitly invalidates the session. If you do not invalidate the session, your app leaks memory until it exits.

因此,您有两种可能的解决方案:

  1. 请求完成后使 session 无效。调用finishTasksAndInvalidate :

    class func getDataFromNewServiceSolOne(serviceName: String, parameters: [String: String]?, success: @escaping (_ result: AnyObject) -> Void, failure: @escaping (_ error: NSError) -> Void) {
        let manager = AFHTTPSessionManager(baseURL: URL(string: baseUrlString))
        manager.post(serviceName, parameters: parameters, headers: nil, progress: { _ in
            // this is intentionally blank
        }, success: { task, result in
            success(result as AnyObject)
        }, failure: { task, error in
            failure(error as NSError)
        })
        manager.session.finishTasksAndInvalidate()    // add this line
    }
    
  2. 另一种方法是不创建单独的 AFHTTPSessionManager对于每个请求,而是实例化一次,然后将其存储在属性中。那么你就不用担心它会失效。另外,创建 session 会产生一定的开销,因此我们经常实例化单个 session ,然后使用它执行许多请求。然后您就不必担心为每个请求创建新 session 并使其失效。

关于ios - 如何快速避免 AFNetworking 导致的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394800/

相关文章:

linux - CMA问题(设计错误)

ios - UILabel.text 与 NSString (iOS) 没有变化

c - 停止线程池运行的好方法是什么?

iphone - 同时隐藏状态栏和导航栏,就像在图片应用程序中一样

swift - 如何在 for case 模式匹配循环中获取索引

ios - 如何在用户快速在textField中输入键时显示键的值

ios - Swift 协议(protocol)和类的弱引用

java - 在 Android 应用程序中放置数据库连接的位置

ios - 没有模拟器出现在我的 Watchkit 目标下

ios - (facebook sdk) com.facebook.sdk.core 错误 8