双指针作为Objective-C块参数

Geo*_* WS 7 objective-c objective-c-blocks

是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?

例如:

- (void)methodWithBlock:(void (^)(NSError **error))block;


其他背景,研究和问题:

  • 我正在使用ARC.
  • 当我声明上面的方法并尝试调用它时,XCode自动完成我的方法调用,如下所示:这里的意思是[self methodWithBlock:^(NSError *__autoreleasing *error) {}]; 什么__autoreleasing,为什么要添加它?我认为它与ARC有关.
  • 如果这可行且安全的,那么指针是否仍然可以在块中取消引用,就像在其他任何地方一样?
  • 一般来说,做我正在描述的内容和简单地将双指针作为方法参数(例如- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?

CRD*_*CRD 2

答案都是“是”和“否”...

在基本级别上,将指针传递给块的指针与将它们传递给方法没有什么不同;并且,通常的条件是您的指针必须有效,这是完全可以的。

然而__autoreleasing,这在这里非常重要,并且与 ARC 和pass-by-writeback紧密相关。使用该块是否按预期工作将取决于上下文,因为编译器在传递类型参数NSError * __autoreleasing *作为传递回写实现的一部分时经常使用隐藏变量。

如果 pass-by-writeback 不是您需要的,或者不合适,您可能希望声明您的块采用不同的类型,例如NSError * __strong *. 阅读这个答案,它解释了幕后发生的事情,这应该可以帮助您确定块声明在您的上下文中是否良好。

总而言之,(a)声明该块是可以的,但是(b)您需要了解如何调用它并且可能需要更改签名。