[英]Get object array argument from NSInvocation with ARC
我有以下签名的方法:
- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong [])
completion:(void (^)(MyInt * __strong response[]))success;
我有几个问题:
1.如何在此方法中使用NSInvocation检索参数?
- (void)forwardInvocation:(NSInvocation *)invocation
我尝试了以下操作,但没有获得正确的值:
__unsafe_unretained MyInt *a[2];
[invocation getArgument:(void *) &a atIndex:index];
我可以有n个int对象的数组,所以我不应该硬编码2。如何在运行时确定对象数组的大小? 我是否需要数组中的哨兵值来确定范围?
2. __strong限定词对输入参数和块参数均正确吗? 请注意,该块是异步的,将在以后执行。
您的方法不采用数组参数,而是采用指针参数。
在C语言中,不可能有数组类型的参数。 如果编写的参数类型为“ X的数组”,则参数将自动更改为“ X的指针”。
Objective-C方法是C函数,但是情况有所不同。 在最新版本的Xcode中,似乎可以使用数组类型的方法参数(尽管似乎没有在任何地方进行记录)。 但是它必须是一个具体的数组类型,即在编译时具有一个硬编码的长度:
- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong [5]);
当它是不完整的数组类型时(例如MyInt *__strong []
),它仍会自动调整为指针(例如MyInt *__strong *
),该值是指向数组第一个元素的指针。
在C语言中(因此在Objective-C中),在给定指向数组第一个元素的指针的情况下,无法知道此“数组”具有多少个元素。 您必须以某种方式分别获取此信息(无论它是一个单独的length参数,以某种结构打包在一起的length和指针,数组中的“ sentinel”值,等等)。
它应该与您将指针传递给第一个元素的数组的类型匹配。 如果它是__strong
的数组,则它需要指向__strong
指针,等等。如果您的操作是异步的,则可能需要复制该数组(这要求您找出问题1的解决方案,如何找出问题的解决方案)。数组的长度),以便您的异步操作对这些MyInt
对象具有强大的引用。 因此,您的数组副本应包含__strong
指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.