【问题标题】:NSURLSession blocks memory managementNSURLSession 阻塞内存管理
【发布时间】:2015-11-01 15:41:09
【问题描述】:

如果我要重新创建 NSURLSession,我是否会复制传递给此函数的块参数:-

- dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;

为了进一步说明,如果我正在编写 NSURLSession,遵循 ARC/Blocks 最佳实践,我是否应该复制传递给上述函数的 completionHandler,因为它们被异步调用(可能在堆栈弹出之后?)。

【问题讨论】:

  • 您能多解释一下吗?你的问题是什么意思?

标签: objective-c automatic-ref-counting objective-c-blocks nsurlsession


【解决方案1】:

NSURLSession 将自己复制这些块。

所以,不,您不需要复制它们。请注意,如果您选择在完成处理程序上调用 copy,除非您自己保留对副本的引用,否则 ARC 会在您“完成”它之后简单地释放副本,这将在副本通过后立即释放进入dataTaskWithRequest:completionHandler:函数。

此外,只有一个完成处理程序传递给该方法。

【讨论】:

  • 对,所以如果我写自己的NSURLSession,我应该复制传递的block参数?
  • 是的。编写一个需要用户管理其资源的类将是非常糟糕的设计。此外,我认为很难避免这样做只是因为保持块可寻址——所有占用块的类属性都是copy,我认为将它添加到NSArrayNSDictionary 将要么隐式复制块,要么拒绝编译,直到你这样做。
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 2011-04-15
  • 2016-03-25
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多