Memory management 我是否必须使用完成处理程序维护对NSURLSessionDataTask的强引用?

Memory management 我是否必须使用完成处理程序维护对NSURLSessionDataTask的强引用?,memory-management,nsurlsession,Memory Management,Nsurlsession,当我在nsursession上使用dataTaskWithRequest:completionHandler:API时,我是否必须保留对我返回的任务的强引用,以便它在完成之前不会被释放,还是系统会一直保留到它完成 例如,这可以吗: [[[NSURLSession sharedSession] dataTaskWithRequest:myRequest completionHandler: ^(NSURLResponse *resp, NSData *data, NSError *err)

当我在
nsursession
上使用
dataTaskWithRequest:completionHandler:
API时,我是否必须保留对我返回的任务的强引用,以便它在完成之前不会被释放,还是系统会一直保留到它完成

例如,这可以吗:

[[[NSURLSession sharedSession] dataTaskWithRequest:myRequest completionHandler:
  ^(NSURLResponse *resp, NSData *data, NSError *err)
  {
    //do something with the response / data / error
  }] resume];
或者我必须这样做:

//assume self.task is a retained property, and is set to nil in dealloc
self.task = [[NSURLSession sharedSession] dataTaskWithRequest:myRequest completionHandler:
  ^(NSURLResponse *resp, NSData *data, NSError *err)
  {
    //do something with the response / data / error
  }];

[self.task resume];

我有使用第一种方法在生产环境中运行的代码,并且没有看到因此而崩溃的情况,但有时它可能会无声地失败,因为任务在完成之前被自动释放池收集,因此从不调用我的完成块。

直到任务完成之后才调用其中的会话(包括调用任何完成处理程序)。不需要自己保留它。

您在文档链接的何处看到此信息?我看不到任何关于保留或释放任务的明确引用。重要提示:会话对象保留对委托的强引用,直到您的应用程序显式使会话无效。如果您不使会话无效,您的应用程序将泄漏内存。我知道它就在那里,因为我写了。:-)哦,等等,这是关于任务的。它曾经说过。我会找的,不。找不到。请根据文档提交一个bug。事实上,它确实保留了自己的任务。