AFNetworking 内存泄漏及其解决办法

2018-05-07  本文已影响170人  其实你懂De

今天闲着没事,利用 Xcode 的 Instruments中 leaks 工具检查了一下项目内存泄漏情况。高高兴兴来检查,mmp,第一个是绿✘,其他都是 ❌,蒙蔽了。这些❌ 都是内存泄漏。OK ,重头开始。
我想大家对这个工具也不陌生了.都会怎么使用了吧,我发现 callTree 基本都是Af报的内存泄漏,在网看了好多资料。看了一下源码,原来是我们每次网络请求是都会调用:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

创建了一下,导致接口请求完之后一直没有得到释放。最后把AFHTTPSessionManager这个对象我做成了单例的,也就是每次请求接口的时候都是用的一个manager。改完之后调试OK,之前的❌都不见了。还是有效果的,下面把单例创建的代码贴一下,记录一下。

#import "JYJHTTPTool.h"
static AFHTTPSessionManager *manager;


+(AFURLSessionManager *)sharedManager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        // 缓存策略
        manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
        //设置超时时间
        [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
        manager.requestSerializer.timeoutInterval = 30.f;
        [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
        // 4. 设置响应数据类型
        
        [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css",@"text/plain", @"application/javascript",@"image/jpeg", @"text/vnd.wap.wml", @"application/x-javascript",@"image/png", nil]];
        [manager.requestSerializer setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    });
    return manager;
}

然后在自己的网络封装里面把 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 换成 AFHTTPSessionManager *manager = [JYJHTTPTool sharedManager];就OK啦! ❌没了。有问题可以大家一起讨论!

上一篇下一篇

猜你喜欢

热点阅读