微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

双指针作为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)你需要了解它是如何调用的,可能需要更改签名.

原文地址:https://www.jb51.cc/c/118664.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐