我创建了一个NSURLSession对象,但没有保留它
{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlRequest]];
[task resume];
}然后我实现了系统委托:
- (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(....);
}
....代码现在运行得很好,没有任何问题。但是我想知道,在系统调用委托之前,会话对象是否可以被释放?如果会话对象被释放,委派会发生什么?
提前谢谢。
发布于 2016-01-30 07:39:10
很明显,只要你在session中有强引用,它就不会被释放。
但是我猜您关心的是session是否是一个局部变量,并且它超出了范围。文档不是很清楚,但从测试中我发现,会话停留在某种形式的自我引用,以完成它的工作。
接下来发生的事情才变得有趣起来。如果你丢失了对会话的引用,就像它只是本地的,那么我相信没有办法再次找到它。这可能是一个内存泄漏,它永远存在,但不可触及。我不是很确定。然而,这并不是您想要做的。
有时,您希望将更多任务添加到同一会话中,在这种情况下,您需要使用一个属性或其他东西来持有它,以便可以持久地访问它。
有时,一旦任务完成,你就会希望它消失。这可以通过在代码中的-resume之后直接调用的-finishTasksAndInvalidate方法来完成。参见文档,它将完成开始的任务,然后最终丢弃代理和自己。
一般来说,您要做的是确保永久使用会话,或者在某个地方调用某个invalidate方法,请参阅类文档中的“管理会话”。
https://stackoverflow.com/questions/35095801
复制相似问题