【问题标题】:memory leak for NSURLSessionNSURLSession 的内存泄漏
【发布时间】:2020-11-09 16:29:27
【问题描述】:

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

【问题讨论】:

  • 嗨Shaik,当您将一个块分配给另一个块时,问题可能出在completionHandler 和completionBlock 上。请仔细检查。

标签: ios objective-c memory-leaks


【解决方案1】:

此代码 sn-p 中的一个问题是您为每个请求创建一个新的NSURLSession,并且您永远不会使会话无效。如果在发起请求后调用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,你会看到这样的泄漏:

致电finishTasksAndInvalidate 将解决这些问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Rob 啊。我会修改的。
    猜你喜欢
    • 2015-07-18
    • 2017-01-17
    • 2015-06-01
    • 2018-01-14
    • 1970-01-01
    • 2014-02-28
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多