【问题标题】:Object dealloc is not called if NSURLSessionTask resume is called如果调用 NSURLSessionTask resume 则不调用对象 dealloc
【发布时间】:2026-01-28 12:10:01
【问题描述】:

我有一个用于下载数据的 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。因此,我认为在使用它们时一定存在一些问题。我试图调用'[self.task cancel]'、'self.task = nil'、'[self.session invalidateAndCancel];'和'[self.session resetWithCompletionHandler:nil];'在我将对象设置为零之前。但没有帮助。

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

【问题讨论】:

  • 嗯,我删除了我的答案,但是您的 [task cancel] 和 task = nil 应该调用 dealloc ,但似乎您可能还有其他东西保持对“DataDownload_A”的强烈引用,您应该为您的“DataDownload_A”调用者发布代码。
  • 谢谢。潜行。我会试试的。

标签: ios nsurlsession dealloc


【解决方案1】:

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

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

这听起来像是一个 URLSession 从它设置的那一刻起一直持有对其委托的强引用,直到它失效或您的应用程序终止,但它可能只在数据(或其他) 任务开始。

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

【讨论】:

  • 嗨,Duncan C.. 你的回答非常接近解决我的问题,这启发了我检查我的会话变量。我确实在将我的对象设置为 nil 之前调用会话无效......但我的会话设置为“保留”..所以在设置回“强”后..它可以解除分配。谢谢。
最近更新 更多