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



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

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

您的方法不接受数组参数,而是接受指针参数。

在C中,不可能有数组类型的参数。如果您编写类型为"array of X"的参数,它将自动更改为类型为"pointer to 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指针。

最新更新