Geo*_* WS 7 objective-c objective-c-blocks
是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?
例如:
- (void)methodWithBlock:(void (^)(NSError **error))block;
其他背景,研究和问题:
[self methodWithBlock:^(NSError *__autoreleasing *error) {}];
什么__autoreleasing,为什么要添加它?我认为它与ARC有关.- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?答案都是“是”和“否”...
在基本级别上,将指针传递给块的指针与将它们传递给方法没有什么不同;并且,通常的条件是您的指针必须有效,这是完全可以的。
然而__autoreleasing,这在这里非常重要,并且与 ARC 和pass-by-writeback紧密相关。使用该块是否按预期工作将取决于上下文,因为编译器在传递类型参数NSError * __autoreleasing *作为传递回写实现的一部分时经常使用隐藏变量。
如果 pass-by-writeback 不是您需要的,或者不合适,您可能希望声明您的块采用不同的类型,例如NSError * __strong *. 阅读这个答案,它解释了幕后发生的事情,这应该可以帮助您确定块声明在您的上下文中是否良好。
总而言之,(a)声明该块是可以的,但是(b)您需要了解如何调用它并且可能需要更改签名。