我有一个带有以下签名的方法:
- (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.如何在运行时确定对象数组的大小?我是否需要在数组中使用sentinel值来确定边界?
2。 __strong限定符对输入参数和块参数都是否正确?请注意,该块是异步的,将在以后执行。
答案 0 :(得分:0)
您的方法不接受数组参数 - 它需要一个指针参数。
在C中,不可能有数组类型的参数。如果你编写一个类型" X"的数组的参数,它会自动更改为"指向X"的指针。
Objective-C方法是C函数,但故事有点不同。在Xcode的最新版本中,似乎您可以拥有数组类型的方法参数(尽管这似乎没有记录在任何地方)。但它必须是具体的数组类型,即在编译时硬编码的长度:
- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong [5]);
如果它是一个不完整的数组类型(例如MyInt *__strong []
),它仍会自动调整为指针(例如MyInt *__strong *
),该值是指向第一个元素的指针阵列。
在C(以及Objective-C)中,在给定指向数组第一个元素的指针的情况下,不可能知道这个"数组"具有。你必须以某种方式单独获取这些信息(无论它是一个单独的长度参数,长度和指针在某种结构中打包在一起,在数组中的" sentinel"值等)。
它应该匹配您将指针传递给第一个元素的数组的类型。如果它是__strong
的数组,那么它需要是指向__strong
等的指针。如果你的操作是异步的,那么你可能需要复制数组(这需要你想象一下)问题1的解决方案,如何计算数组的长度),以便您的异步操作将具有对这些MyInt
对象的强引用。因此,您的数组副本应包含__strong
个指针。