Objective c NSURLSession块内存管理

Objective c NSURLSession块内存管理,objective-c,automatic-ref-counting,objective-c-blocks,nsurlsession,Objective C,Automatic Ref Counting,Objective C Blocks,Nsurlsession,如果要重新创建NSURLSession,是否要复制传递到此函数中的块参数:- - dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; 为了进一步说明,如果我在编写NSURLSession,遵循ARC/Blocks最佳实践,我是否应该复制传递到上述函数中的co

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

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

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

NSURLSession
将复制这些块本身

所以,不,你不需要复制它们。请注意,如果您选择在完成处理程序上调用
copy
,除非您自己保留了对该副本的引用,否则ARC将在您“完成”该副本后释放该副本,这将在该副本传递到
dataTaskWithRequest:completionHandler:
函数后立即释放


另外,该方法中只传递了一个完成处理程序。

您能给出一些额外的解释吗?你的问题是什么意思?是的,如果我正在编写自己的NSURLSession,我应该复制传递的块参数?是的。编写一个需要用户管理其资源的类是非常糟糕的设计。此外,我认为,保持块可寻址的结果是很难避免这样做的——所有获取块的类属性都是
copy
,我认为将其添加到
NSArray
NSDictionary
中会隐式复制块,或者拒绝编译,直到您这样做。