iOS AFHTTPSessionManager內存泄漏解決方案

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。