必须保留NSURLSession对象

时间:2016-01-29 23:13:37

标签: ios objective-c nsurlsession

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

var LocalStrategy = require('passport-local').Strategy;

然后我实现了系统委托:

{
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlRequest]];

    [task resume];
}

代码工作正常,没有任何问题。但我想知道在系统调用委托之前是否可以释放会话对象?如果取消分配会话对象,代理会发生什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

嗯,显然只要你在session中有强大的引用,它就不会解除分配。

但我想你担心的是session是一个局部变量而且它超出了范围。文档不太清楚,但是从测试中我发现会话保留了某种形式的自我引用来完成它的工作。

然后发生的事情变得有趣。如果您丢失了对会话的引用,就好像它只是本地的那样,那么我相信无法再找到它。这可能是内存泄漏,它永远存在但不可触及。我不太确定。然而,这不是你想要做的。

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

有时你希望它在任务完成后消失。这可以使用您在代码中-finishTasksAndInvalidate之后直接调用的方法-resume来完成。查看文档,它将完成启动的任务,然后最终删除委托和自己。

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