如果调用 NSURLSessionTask 恢复,则不会调用对象 dealloc
Object dealloc is not called if NSURLSessionTask resume is called
我有一个 NSObject class '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 从设置到它失效或您的应用程序终止的那一刻都持有对其委托的强引用,但它可能只在数据 (或其他)任务开始。
听起来您需要使 URLSession 无效才能让它释放它的委托。我建议在 Xcode 的 URLSession
文档中搜索该文本。同时搜索 "invalidate"
我有一个 NSObject class '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 从设置到它失效或您的应用程序终止的那一刻都持有对其委托的强引用,但它可能只在数据 (或其他)任务开始。
听起来您需要使 URLSession 无效才能让它释放它的委托。我建议在 Xcode 的 URLSession
文档中搜索该文本。同时搜索 "invalidate"