AFNetworking Memory Leaks 問題

我們在直接使用AFNetworking的時候, 會遇到內存泄漏問題. 在Instruments的Leaks上表現為很多紅色叉叉, 只要一請求后臺服務器就會出現AF的內存泄漏.(基于Xcode8.0/macOS Sierra平臺 )

先說怎么打開Leaks, 有兩個方式:

1. Xcode - Open Developer Tool - Instruments - Leaks
2. Product - Profile - Leaks

點擊左上方紅色圓圈開始檢測, 然后如圖:


下邊欄選擇Leaks改為Call tree, 右邊欄選擇第二個設置按鈕, 勾選Invert Call Tree和Hide System Libraries. 這時列表里就會列出所有檢測到的內存泄漏.


Tips:
有時Symbol顯示的是內存地址,而不是代碼中的方法名,這是需要把Build Setting里把Debug Information Format改成DWARF with dSYM File, 如圖:



但是沒有使用Instrument的時候建議改回DWARF, 加快編譯速度.

接下來就是如何解決這個Memory Leaks的問題了.

分析發現, AF的內存泄漏主要發生在manager的初始化方法中. 因此解決辦法就是重寫manager方法.

if(!self.manager)
{
    self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
    self.manager.requestSerializer = [AFJSONRequestSerializer serializer];
    self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
}

抑或者使用單例.

+ (AFHTTPSessionManager *)sharedHTTPSession{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer.timeoutInterval = 5;
    });
    return manager;
}
+ (AFURLSessionManager *)sharedURLSession{
    static dispatch_once_t onceToken2;
    dispatch_once(&onceToken2, ^{
        urlsession = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    });
    return urlsession;
}

再回去試試, memory leaks問題是不是解決了.


文章部分來源于網絡. 由于筆者知識有限,如有錯誤,歡迎指出。

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

推薦閱讀更多精彩內容