我們在直接使用AFNetworking的時(shí)候, 會(huì)遇到內(nèi)存泄漏問題. 在Instruments的Leaks上表現(xiàn)為很多紅色叉叉, 只要一請求后臺(tái)服務(wù)器就會(huì)出現(xiàn)AF的內(nèi)存泄漏.(基于Xcode8.0/macOS Sierra平臺(tái) )
先說怎么打開Leaks, 有兩個(gè)方式:
1. Xcode - Open Developer Tool - Instruments - Leaks
2. Product - Profile - Leaks
點(diǎn)擊左上方紅色圓圈開始檢測, 然后如圖:
下邊欄選擇Leaks改為Call tree, 右邊欄選擇第二個(gè)設(shè)置按鈕, 勾選Invert Call Tree和Hide System Libraries. 這時(shí)列表里就會(huì)列出所有檢測到的內(nèi)存泄漏.
Tips:
有時(shí)Symbol顯示的是內(nèi)存地址,而不是代碼中的方法名蛙紫,這是需要把Build Setting里把Debug Information Format改成DWARF with dSYM File, 如圖:
但是沒有使用Instrument的時(shí)候建議改回DWARF, 加快編譯速度.
接下來就是如何解決這個(gè)Memory Leaks的問題了.
分析發(fā)現(xiàn), AF的內(nèi)存泄漏主要發(fā)生在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問題是不是解決了.
文章部分來源于網(wǎng)絡(luò). 由于筆者知識(shí)有限,如有錯(cuò)誤悼吱,歡迎指出痛悯。