Ios 如果调用了NSURLSessionTask resume,则不会调用对象dealloc

Ios 如果调用了NSURLSessionTask resume,则不会调用对象dealloc,ios,nsurlsession,dealloc,Ios,Nsurlsession,Dealloc,我有一个NSObject类“DataDownload\u a”用于下载数据。在内部,我使用NSURLSession和NSURLSessionTask。现在的问题是,当我将这个对象设置为nil时,将不会调用dealloc。以下是DataDownload_a的段代码: NSString *urlString = [self URL]; NSURL *url = [NSURL URLWithString:urlString]; NSURLReques

我有一个NSObject类“DataDownload\u 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。因此,我假设在使用它们时一定存在一些问题。我试图调用“[self.task cancel]”、“self.task=nil”、“[self.session invalidateAndCancel]”和“[self.session resetWithCompletionHandler:nil];”在我把目标设为零之前。但是没有帮助


有人知道我犯了什么错误吗??如果您能告诉我,我将不胜感激。先谢谢你

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

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

这一点让它听起来像一个URLSession从它设置的那一刻起一直持有对它的委托的强引用,直到它失效或你的应用程序终止,但它可能只是在数据(或其他)任务启动时才创建一个强引用


听起来您需要使URLSession无效,以使其释放其委托。我建议在Xcode中的
URLSession
文档中搜索该文本。同时搜索“invalidate”

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

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

这一点让它听起来像一个URLSession从它设置的那一刻起一直持有对它的委托的强引用,直到它失效或你的应用程序终止,但它可能只是在数据(或其他)任务启动时才创建一个强引用


听起来您需要使URLSession无效,以使其释放其委托。我建议在Xcode中的
URLSession
文档中搜索该文本。同时搜索“invalidate”

Hmm,我删除了我的答案,但是你的[task cancel]和task=nil应该调用dealloc,但似乎你可能有其他东西保留了对你的“DataDownload\u a”的强烈引用,你应该为你的“DataDownload\u a”来电者发布代码。谢谢。偷偷地走我会试试。嗯,我删除了我的答案,但是你的[task cancel]和task=nil应该打电话给dealloc,但似乎你可能有其他东西在强烈引用你的“DataDownload\u a”,你应该为你的“DataDownload\u a”来电者发布代码。谢谢。偷偷地走我会试试的。嗨,邓肯。。您的答案非常接近于解决我的问题,这启发了我检查会话变量。。在将对象设置为零之前,我确实调用了会话无效。。。但我的会话设置为“保留”。。所以在回到“坚强”之后。。它可以解除锁定。谢谢。嗨,邓肯。。您的答案非常接近于解决我的问题,这启发了我检查会话变量。。在将对象设置为零之前,我确实调用了会话无效。。。但我的会话设置为“保留”。。所以在回到“坚强”之后。。它可以解除锁定。非常感谢。