我有一个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之前。但没有帮助。
所以有人知道我犯了什么错吗?不胜感激让我知道。先感谢您。
答案 0 :(得分:4)
看起来URLSession
拥有对其委托的强引用。我在URLSession
上的文档中找到了这一行:
重要说明:会话对象保留对委托的强引用 直到您的应用明确使会话无效。如果你不 使会话无效,您的应用程序会泄漏内存。
这一点听起来像一个URLSession从其设置的那一刻起持有一个强大的引用,直到它被无效或你的应用程序被终止,但它可能只是在数据(或其他)时创建一个强引用)任务开始了。
听起来你需要使URLSession无效才能让它释放它的委托。我建议在Xcode的URLSession
文档中搜索该文本。同时搜索“invalidate”