如果调用NSURLSessionTask resume,则不调用Object dealloc

时间:2017-02-13 03:19:45

标签: ios nsurlsession dealloc

我有一个NSObject课程' DataDownload_A'用于下载数据。在里面我使用NSURLSession和NSURLSessionTask。现在问题是当我将这个对象设置为nil时,dealloc不会被调用。以下是DataDownload_A的细分代码:

    NSString *urlString = [self URL];
    NSURL *url               = [NSURL URLWithString:urlString];
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url
                                                cachePolicy:NSURLRequestUseProtocolCachePolicy
                                            timeoutInterval:60.0];

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    self.session = [NSURLSession sessionWithConfiguration:configuration
                                                 delegate:self
                                            delegateQueue:nil];
    self.receivedData = [NSMutableData data];

    self.task = [self.session dataTaskWithRequest:theRequest];
    [self.task resume];

如果我评论最后两行' self.task = [self.session dataTaskWithRequest:theRequest];'和' [self.task resume];',将调用dealloc。因此,我认为在使用它们时一定存在一些问题。我试着打电话给[#tart.task cancel]',' self.task = nil',' [self.session invalidateAndCancel];'和' [self.session resetWithCompletionHandler:nil];'在我将对象设置为nil之前。但没有帮助。

所以有人知道我犯了什么错吗?不胜感激让我知道。先感谢您。

1 个答案:

答案 0 :(得分:4)

看起来URLSession拥有对其委托的强引用。我在URLSession上的文档中找到了这一行:

  

重要说明:会话对象保留对委托的强引用   直到您的应用明确使会话无效。如果你不   使会话无效,您的应用程序会泄漏内存。

这一点听起来像一个URLSession从其设置的那一刻起持有一个强大的引用,直到它被无效或你的应用程序被终止,但它可能只是在数据(或其他)时创建一个强引用)任务开始了。

听起来你需要使URLSession无效才能让它释放它的委托。我建议在Xcode的URLSession文档中搜索该文本。同时搜索“invalidate”