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