例如:
– (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)你需要了解它是如何调用的,可能需要更改签名.