- 第一種情況
單獨(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 會(huì)看到

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 不會(huì)造成內(nèi)存泄漏
- 設(shè)置屬性
@property (nonatomic, strong) NSURLSession *session;
也不會(huì)造成內(nèi)存泄漏
4.結(jié)論

Snip20170928_5.png
通過NSURLSession的頭文件我們發(fā)現(xiàn),NSURLSession對(duì)于它的 delegate屬性是強(qiáng)引用。這就意味著當(dāng)session存在時(shí),其delegate就不會(huì)被釋放。另外,由session發(fā)起請(qǐng)求的緩存相關(guān)對(duì)象也會(huì)被其強(qiáng)引用并一直保留在內(nèi)存中。
所以為了避免內(nèi)存泄漏,根據(jù)Apple文檔,當(dāng)一個(gè)session不再使用時(shí),我們應(yīng)該調(diào)用finishTasksAndInvalidate或者invalidateAndCancel把session顯式地置為無效(invalidated),以釋放對(duì)相關(guān)對(duì)象的引用。
http://weibo.com/3321824014/E7SIdd0uD?filter=hot&root_comment_id=0&type=comment#_rnd1506581955467