NSURLSession时需要注意一个内存泄漏问题

  1. 第一种情况
    单独初始化 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 会看到

Snip20170928_3.png
  1. 第二种情况,使用
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 不会造成内存泄漏

  1. 设置属性
@property (nonatomic, strong) NSURLSession *session;

也不会造成内存泄漏
4.结论

Snip20170928_5.png

通过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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,029评论 1 16
  • Github : Jerry4me, Demo : JRBgSessionDemo 前言 本文主要是结合官方文档,...
    Jerry4me阅读 11,939评论 11 53
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,250评论 30 472
  • 在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSessio...
    lxl125z阅读 2,391评论 0 1
  • 前言 内存泄露是一个相对挺严重的问题,可是它的存在未引起足够的重视,如果程序运行时一直分配内存而不及时释放无用的内...
    進无尽阅读 1,814评论 0 5