我有一个具有以下签名的方法:
- (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 *
),该值是指向数组第一个元素的指针。
在C(以及Objective-C)中,给定一个指向数组第一个元素的指针,就不可能知道这个"数组"有多少元素。您必须以某种方式单独获取这些信息(无论是单独的长度参数、以某种结构打包在一起的长度和指针、数组中的"sentinel"值等)
它应该与将指针传递给的第一个元素的数组的类型相匹配。如果它是
__strong
的数组,那么它需要是指向__strong
的指针,等等。如果您的操作是异步的,那么您可能需要复制数组(这需要您找出问题1的解决方案,即如何计算数组的长度),这样您的异步操作将对这些MyInt
对象具有强引用。因此,数组的副本应该包含__strong
指针。