今天在测试的时候发现连续进入某个页面会出现内存暴涨的情况。用leaks检查后发现是AFNetworking框架报的的内存泄漏。然后查阅了资料和源码。发现问题出现在
[AFHTTPSessionManager manager];
这句代码这里。manager其实并不是一个单例。查看AFNetworking的源码发现它的实现为
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
意味着我们每次调用都创建了一个实例对象。导致内存泄漏。
现在有两种解决方案。
一 ,自己创建一个单例对象。每次由自己创建的单例对象进行请求。
static AFHTTPSessionManager *manager ;
+ (AFHTTPSessionManager *)sharedHTTPSession
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [AFHTTPSessionManager manager];
});
return manager;
}
创建自己的单例类NetworkManager,实例化方法为上代码。
NetworkManager *manager = [NetworkManager sharedHTTPSession];
[manager GET:urlStr parameters:para progress:nil success:nil failure:nil];
这样就不会有泄漏了。
二 ,直接修改源码 ,将AFNetworking中的源码manger方法修改了
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
将这段代码修改成下面的就行了
static AFHTTPSessionManager *httpManager;
+ (instancetype)manager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
httpManager = [[[self class] alloc] initWithBaseURL:nil];
});
return httpManager;
建议使用第一种,第二种修改了源码。以后你升级AFNetworking需要再次修改源码。
网友评论