美文网首页
NSURLSession--内存泄漏问题

NSURLSession--内存泄漏问题

作者: Mikayla321 | 来源:发表于2018-05-17 14:15 被阅读0次

    1.第一种情况

    单独初始化 NSURLSession

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://baidu.com"]];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueuemainQueue]];

    [[session dataTaskWithRequest:request] resume];

    设置代理,并在代理方法

    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask    didReceiveData:(NSData *)data {

        NSLog(@"=====%@", [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding]);

      // [session  finishTasksAndInvalidate];

    }

    运行,打开 instruments 会看到

    Snip20170928_3.png

    第二种情况,使用

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURLURLWithString:@"https://baidu.com"]];    

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {

    NSLog(@"=====%@",[[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);   

     }] resume] ;

    打开 instruments 不会造成内存泄漏

    3.设置属性

    @property(nonatomic, strong) NSURLSession*session;

    也不会造成内存泄漏

    4.结论

    Snip20170928_5.png

    通过NSURLSession的头文件我们发现,NSURLSession对于它的 delegate属性是强引用。这就意味着当session存在时,其delegate就不会被释放。另外,由session发起请求的缓存相关对象也会被其强引用并一直保留在内存中。

    所以为了避免内存泄漏,根据Apple文档,当一个session不再使用时,我们应该调用finishTasksAndInvalidate或者invalidateAndCancel把session显式地置为无效(invalidated),以释放对相关对象的引用。

    作者:浅y

    链接:https://www.jianshu.com/p/b456e5591e70

    相关文章

      网友评论

          本文标题:NSURLSession--内存泄漏问题

          本文链接:https://www.haomeiwen.com/subject/krybdftx.html