我有一个用于下载数据的 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];'在我将对象设置为零之前。但没有帮助。
那么有人知道我犯了什么错误吗?让我知道将不胜感激。先感谢您。
最佳答案
它看起来像 URLSession
强烈引用其代表。我在 URLSession
上的文档中找到了这一行:
Important: The session object keeps a strong reference to the delegate until your app explicitly invalidates the session. If you do not invalidate the session, your app leaks memory.
这一点听起来像是一个 URLSession 从它设置的那一刻起一直持有对其委托(delegate)的强引用,直到它失效或您的应用程序被终止,但它可能只是在数据(或其他)任务被终止时才创建强引用开始了。
听起来您需要使 URLSession 无效才能使其释放它的委托(delegate)。我建议在
URLSession
中搜索该文本Xcode 中的文档。也搜索“无效”
关于ios - 如果调用 NSURLSessionTask resume 则不调用对象 dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196169/