iOS 开发者的日常iOS Developer奔跑吧 iOS

AFNetworking Memory Leaks 问题

2016-12-30  本文已影响447人  KenZhangCn

我们在直接使用AFNetworking的时候, 会遇到内存泄漏问题. 在Instruments的Leaks上表现为很多红色叉叉, 只要一请求后台服务器就会出现AF的内存泄漏.(基于Xcode8.0/macOS Sierra平台 )

先说怎么打开Leaks, 有两个方式:

1. Xcode - Open Developer Tool - Instruments - Leaks
2. Product - Profile - Leaks

点击左上方红色圆圈开始检测, 然后如图:


下边栏选择Leaks改为Call tree, 右边栏选择第二个设置按钮, 勾选Invert Call Tree和Hide System Libraries. 这时列表里就会列出所有检测到的内存泄漏.


Tips:
有时Symbol显示的是内存地址,而不是代码中的方法名,这是需要把Build Setting里把Debug Information Format改成DWARF with dSYM File, 如图:



但是没有使用Instrument的时候建议改回DWARF, 加快编译速度.

接下来就是如何解决这个Memory Leaks的问题了.

分析发现, AF的內存泄漏主要发生在manager的初始化方法中. 因此解决办法就是重写manager方法.

if(!self.manager)
{
    self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
    self.manager.requestSerializer = [AFJSONRequestSerializer serializer];
    self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
}

抑或者使用单例.

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

再回去试试, memory leaks问题是不是解决了.


文章部分来源于网络. 由于笔者知识有限,如有错误,欢迎指出。

上一篇下一篇

猜你喜欢

热点阅读