我們在直接使用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問題是不是解決了.
文章部分來源于網絡. 由于筆者知識有限,如有錯誤,歡迎指出。