0

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

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

4

1 回答 1

0

您的方法不采用数组参数——它采用指针参数。

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

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

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

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

  1. 在 C 语言(以及 Objective-C 语言)中,给定一个指向数组第一个元素的指针,不可能知道这个“数组”有多少个元素。您必须以某种方式单独获取此信息(无论是单独的长度参数、封装在某种结构中的长度和指针、数组中的“哨兵”值等)。

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

于 2014-04-23T10:28:19.490 回答