缓和AFNetworking产生的内部存款和储蓄器泄漏,网

最近项目收尾阶段,开始做一些优化相关的东西。用instruments做内存泄漏分析时,发现所有调用网络请求的地方,都有内存泄漏。瞬间感觉有点懵。

原文地址:

在使用instruments做内存泄漏分析时,发现所有使用如下语句的地方都有内存泄漏,OMG:

首先,我们先说明一下为什么要封装网络请求的单例类:
用instruments测试项目内存的时候突然发现了大量的内存泄漏,并且都指向AFN,发现使用AFHTTPSessionManager的地方都出现了内存泄漏,上网查资料发现跟踪AFHTTPSessionManager的实例manager,在请求实例dealloc后,其中的manager的确没有被释放。NSURLSession的代理是强引用,如果不主动调用废弃操作,会有内存泄露。
参考资料:AFN为什么会内存泄漏
所以需要将AFHTTPSessionManager封装成单例类

图片 1

在使用instruments做内存泄漏分析时,发现所有使用如下语句的地方都有内存泄漏,OMG:

if (!_manager) {

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

@implementation YSSAFHTTPSessionManager

  (AFHTTPSessionManager *)sharedManager {

    static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
        // 初始化请求管理类
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer = [AFJSONRequestSerializer serializer];
//        // 设置15秒超时 - 取消请求
        manager.requestSerializer.timeoutInterval = 30.0;
//        // 编码
//        manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
//        // 缓存策略
//        manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

        manager.responseSerializer = [AFJSONResponseSerializer serializer];
        // 支持内容格式
        manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"application/octet-stream",@"multipart/form-data",@"text/plain", nil];
    });
    return manager;

}
@end

百度查了好久,才发现原来都是AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];的原因。由于ARC的机制,每当实例华session后,没有地方来释放,所以造成内存泄漏。把manager的实例改成单例模式,就好了。

if(!_manager){

         self.manager = [AFHTTPSessionManager manager];

之后再用instruments测试,发现完全没有内存泄漏了~

图片 2

_manager = [AFHTTPSessionManager manager];

}

用到AFHTTPSessionManager时,[AFNManagerTool shareAFNManager]一步搞定。再次用instruments做内存泄漏分析,问题解决。^_^

}

只能找度娘了,还好找到了解决办法,有前辈给出了解决方案:

图片 3

stack overflow上查了下并没有找到好的解决方案,去github的AFN的issue区查了下,确实有几个人提问了,但是每人给出解决方案。

图片 4

图片 5

但是我所用到的网络请求不是很复杂,不想再新建类去写单例了,就把单例放在了AppDelegate中,用到的时候在通过AppDelegate拿。因为需要用到AFHTTPSessionManager和AFURLSessionManager,所以就各写一个单例方法。

图片 6

static AFHTTPSessionManager *manager ;

没人解决就算了,结果这货自己莫名其妙没泄漏了,不继续探究为什么上次有内存泄漏。

static AFURLSessionManager *urlsession ;

图片 7

-(AFHTTPSessionManager *)sharedHTTPSession{

无奈只能找度娘了,还好找到了解决办法,有前辈给出了解决方案:

static dispatch_once_t onceToken;

图片 8

dispatch_once(&onceToken, ^{

但是我所用到的网络请求不是很复杂,不想再新建类去写单例了,就把单例放在了AppDelegate中,用到的时候在通过AppDelegate拿。因为需要用到AFHTTPSessionManager和AFURLSessionManager,所以就各写一个单例方法。

manager = [AFHTTPSessionManager manager];

static AFHTTPSessionManager *manager ;static AFURLSessionManager *urlsession ;-(AFHTTPSessionManager *)sharedHTTPSession{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        manager = [AFHTTPSessionManager manager];        manager.requestSerializer.timeoutInterval =10;    });returnmanager;}-(AFURLSessionManager *)sharedURLSession{    static dispatch_once_t onceToken2;    dispatch_once(&onceToken2, ^{        urlsession =[[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];    });returnurlsession;}

manager.requestSerializer.timeoutInterval = 10;

获得AFHTTPSessionManager和AFURLSessionManager单例

});

//AFHTTPSessionManagerAppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication]delegate];AFHTTPSessionManager *manager = [app sharedHTTPSession];//AFURLSessionManagerAppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication]delegate];AFURLSessionManager *urlsession = [app sharedURLSession];

return manager;

全部替换完之后再用 instruments跑一遍,再也没有红叉了 ^_^ 。

}

-(AFURLSessionManager *)sharedURLSession{

static dispatch_once_t onceToken2;

dispatch_once(&onceToken2, ^{

urlsession = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

});

return urlsession;

}

获得AFHTTPSessionManager和AFURLSessionManager单例

//AFHTTPSessionManager

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

AFHTTPSessionManager *manager = [app sharedHTTPSession];

//AFURLSessionManager

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

AFURLSessionManager *urlsession = [app sharedURLSession];

全部替换完之后再用 instruments跑一遍,再也没有红叉了 ^_^ 。

本文由星彩网app下载发布于计算机编程,转载请注明出处:缓和AFNetworking产生的内部存款和储蓄器泄漏,网

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。