首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSURLSession内存泄漏

NSURLSession内存泄漏
EN

Stack Overflow用户
提问于 2020-07-20 12:09:45
回答 2查看 153关注 0票数 1

在xcode仪器中,我得到了这个方法内存泄漏。

代码语言:javascript
运行
复制
- (void)getDataForRequest:(NSURLRequest *)request completionHandler:(downloadCompletionBlock)completionHandler
{
    self.expectedLength = 0;
    self.currentLength = 0;
    self.responseData = Nil;
    
    self.contentLengthBlock = nil;
    self.completionBlock = completionHandler;
    
    NSURLSession *session = [NSURLSession sharedSession];
    
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    session = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
    
    self.postDataTask = [session dataTaskWithRequest:request];
    
    [self.postDataTask resume];
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-20 17:37:41

这个代码片段中的一个问题是,您正在为每个请求创建一个新的NSURLSession,并且您从未使会话无效。如果在请求启动后调用finishTasksAndInvalidate,它将:

当请求完成时,

  • 将回收与NSURLSession关联的内存;通过这样做,
  • 还将释放对delegate对象的强引用。

因此:

代码语言:javascript
运行
复制
- (void)getDataForRequest:(NSURLRequest *)request completionHandler:(DownloadCompletionBlock)completionHandler {
    self.expectedLength = 0;
    self.currentLength = 0;
    self.responseData = nil;

    self.contentLengthBlock = nil;
    self.completionBlock = completionHandler;

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    self.postDataTask = [session dataTaskWithRequest:request];

    [self.postDataTask resume];
    [session finishTasksAndInvalidate];
}

如果不使用finishTasksAndInvalidate,就会看到这样的漏洞:

调用finishTasksAndInvalidate将解决这些问题。

票数 3
EN

Stack Overflow用户

发布于 2020-07-20 13:48:29

问题可能是短语delegate: self。NSURLSession保留其委托。因此,您告诉会话保留此实例(可能是视图控制器)。在使会话无效之前,视图控制器不能退出。

解决方案是:正确管理您的会话。保持对会话的引用,以便以后可以使其无效。更好的是,使委托成为一个轻量级对象,与可以管理其内存的视图控制器不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62995090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档