使用ARC从NSInvocation获取对象数组参数

时间:2014-04-22 18:15:49

标签: ios arrays automatic-ref-counting nsinvocation message-forwarding

我有一个带有以下签名的方法:

- (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限定符对输入参数和块参数都是否正确?请注意,该块是异步的,将在以后执行。

1 个答案:

答案 0 :(得分:0)

您的方法不接受数组参数 - 它需要一个指针参数。

在C中,不可能有数组类型的参数。如果你编写一个类型" X"的数组的参数,它会自动更改为"指向X"的指针。

Objective-C方法是C函数,但故事有点不同。在Xcode的最新版本中,似乎您可以拥有数组类型的方法参数(尽管这似乎没有记录在任何地方)。但它必须是具体的数组类型,即在编译时硬编码的长度:

- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong [5]);

如果它是一个不完整的数组类型(例如MyInt *__strong []),它仍会自动调整为指针(例如MyInt *__strong *),该值是指向第一个元素的指针阵列。

  1. 在C(以及Objective-C)中,在给定指向数组第一个元素的指针的情况下,不可能知道这个"数组"具有。你必须以某种方式单独获取这些信息(无论它是一个单独的长度参数,长度和指针在某种结构中打包在一起,在数组中的" sentinel"值等)。

  2. 它应该匹配您将指针传递给第一个元素的数组的类型。如果它是__strong的数组,那么它需要是指向__strong等的指针。如果你的操作是异步的,那么你可能需要复制数组(这需要你想象一下)问题1的解决方案,如何计算数组的长度),以便您的异步操作将具有对这些MyInt对象的强引用。因此,您的数组副本应包含__strong个指针。