- 第一種情況
單獨(dú)初始化 NSURLSession
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://baidu.com"]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// self.session = session;
[[session dataTaskWithRequest:request] resume];
設(shè)置代理略水,并在代理方法
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
NSLog(@"=====%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// [self.session finishTasksAndInvalidate];
}
運(yùn)行,打開 instruments 會看到
Snip20170928_3.png
- 第二種情況劝萤,使用
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://baidu.com"]];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"=====%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}] resume] ;
打開 instruments 不會造成內(nèi)存泄漏
- 設(shè)置屬性
@property (nonatomic, strong) NSURLSession *session;
也不會造成內(nèi)存泄漏
4.結(jié)論
Snip20170928_5.png
通過NSURLSession的頭文件我們發(fā)現(xiàn)渊涝,NSURLSession對于它的 delegate屬性是強(qiáng)引用。這就意味著當(dāng)session存在時(shí)稳其,其delegate就不會被釋放驶赏。另外,由session發(fā)起請求的緩存相關(guān)對象也會被其強(qiáng)引用并一直保留在內(nèi)存中既鞠。
所以為了避免內(nèi)存泄漏煤傍,根據(jù)Apple文檔,當(dāng)一個(gè)session不再使用時(shí)嘱蛋,我們應(yīng)該調(diào)用finishTasksAndInvalidate或者invalidateAndCancel把session顯式地置為無效(invalidated)蚯姆,以釋放對相關(guān)對象的引用。
http://weibo.com/3321824014/E7SIdd0uD?filter=hot&root_comment_id=0&type=comment#_rnd1506581955467