双指针作为Objective-C块参数

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

例如:

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

其他背景,研究和问题:

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

解决方法

答案是肯定的和没有…

在基类级别传递指向块指针的指针与将它们传递给方法没有什么不同;并且,通常的条件是你的指针必须有效,完全没问题.

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

如果pass-by-writeback不是您需要的或不适合的,您可能希望声明阻止采用不同的类型,例如NSError * __strong *.阅读this answer,它解释了引擎盖下发生的事情,它可以帮助您确定在您的上下文中块声明是否良好.

总结(a)声明块是好的,但是(b)你需要了解它是如何调用的,可能需要更改签名.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...