我们在直接使用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问题是不是解决了.
文章部分来源于网络. 由于笔者知识有限,如有错误,欢迎指出。