第一種方案:把該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檢測出來的內存泄漏問題。