- 第一种情况
单独初始化 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];
设置代理,并在代理方法
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
NSLog(@"=====%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// [self.session finishTasksAndInvalidate];
}
运行,打开 instruments 会看到
- 第二种情况,使用
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 不会造成内存泄漏
- 设置属性
@property (nonatomic, strong) NSURLSession *session;
也不会造成内存泄漏
4.结论
通过NSURLSession的头文件我们发现,NSURLSession对于它的 delegate属性是强引用。这就意味着当session存在时,其delegate就不会被释放。另外,由session发起请求的缓存相关对象也会被其强引用并一直保留在内存中。
所以为了避免内存泄漏,根据Apple文档,当一个session不再使用时,我们应该调用finishTasksAndInvalidate或者invalidateAndCancel把session显式地置为无效(invalidated),以释放对相关对象的引用。
http://weibo.com/3321824014/E7SIdd0uD?filter=hot&root_comment_id=0&type=comment#_rnd1506581955467