ios - NSURLSession的内存泄漏

标签 ios objective-c memory-leaks

在xcode仪器中,我遇到此方法内存泄漏

- (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];
}

最佳答案

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

请求完成时,

  • 回收与NSURLSession相关的内存;这样,它也会
  • 释放对delegate对象的强引用。

  • 从而:
    - (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,则会看到类似这样的泄漏:
    enter image description here
    调用finishTasksAndInvalidate将解决这些问题。

    关于ios - NSURLSession的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62995090/

    相关文章:

    iphone - 为什么这段代码会产生内存泄漏?

    iOS 创建带有两个独立标签的按钮

    objective-c - 不知道为什么我可以使用 objectAtIndex 访问这个数组值

    objective-c - 理解 Objective-C 2.0 中的实例变量和属性

    ios - 如何在控制中心隐藏 "Now playing url"

    node.js - 为什么 node.js 不释放内存?

    haskell - IO/Monadic 分配运算符导致 ghci 为无限列表爆炸

    ios - 节点的位置在物理模拟过程中保持不变

    iOS - 使用 AutoLayout 构建 UI 时,在界面构建中模拟指标下应该使用什么尺寸

    ios - 无法将 Json 数据加载到 Swift 3 中的 Collection View ?