第一种方案:把该manager封装成单例
解决理由:内存中的某一块固定的地址就用来存放manager,专门用来网络请求和释放。
方案代码:
static AFHTTPSessionManager *manager;
/* 封装成 单例会话管理者 */
+ (AFHTTPSessionManager *)sharedManager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 初始化请求管理类
manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置15秒超时 - 取消请求
manager.requestSerializer.timeoutInterval = 15.0;
// 编码
manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
// 缓存策略
manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 支持内容格式
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/javascript", @"text/json", @"text/html", nil];
});
return manager;
}
问题:很明显,同一时刻只能有一个网络请求。异步会有问题。当两个线程同时申请manager对象时,肯定有一个manager申请不到,无法网络请求
第二种方案:在网络请求的block内把task取消掉
无论是success,还是failure的回调都取消掉,当然在block外部需要弱化一下manager对象
__weak typeof(manager) weakManager = manager;
然后在两个回调方法里加上
[weakManager invalidateSessionCancelingTasks:YES];
两种方案都可以解决内存泄漏问题。小编推荐第二种,封装在某个网络请求基类里,或者每次网络请求结束都写上。
完美解决了用leaks检测出来的内存泄漏问题。