首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >必须保留NSURLSession对象

必须保留NSURLSession对象
EN

Stack Overflow用户
提问于 2016-01-30 07:13:37
回答 1查看 1.2K关注 0票数 2

我创建了一个NSURLSession对象,但没有保留它

代码语言:javascript
复制
{
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlRequest]];

    [task resume];
}

然后我实现了系统委托:

代码语言:javascript
复制
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    ....
}

- (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler
{
    ....
    completionHandler(....);
}

....

代码现在运行得很好,没有任何问题。但是我想知道,在系统调用委托之前,会话对象是否可以被释放?如果会话对象被释放,委派会发生什么?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-01-30 07:39:10

很明显,只要你在session中有强引用,它就不会被释放。

但是我猜您关心的是session是否是一个局部变量,并且它超出了范围。文档不是很清楚,但从测试中我发现,会话停留在某种形式的自我引用,以完成它的工作。

接下来发生的事情才变得有趣起来。如果你丢失了对会话的引用,就像它只是本地的,那么我相信没有办法再次找到它。这可能是一个内存泄漏,它永远存在,但不可触及。我不是很确定。然而,这并不是您想要做的。

有时,您希望将更多任务添加到同一会话中,在这种情况下,您需要使用一个属性或其他东西来持有它,以便可以持久地访问它。

有时,一旦任务完成,你就会希望它消失。这可以通过在代码中的-resume之后直接调用的-finishTasksAndInvalidate方法来完成。参见文档,它将完成开始的任务,然后最终丢弃代理和自己。

一般来说,您要做的是确保永久使用会话,或者在某个地方调用某个invalidate方法,请参阅类文档中的“管理会话”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35095801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档