繁体   English   中英

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

[英]Get object array argument from NSInvocation with ARC

我有以下签名的方法:

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

您的方法不采用数组参数,而是采用指针参数。

在C语言中,不可能有数组类型的参数。 如果编写的参数类型为“ X的数组”,则参数将自动更改为“ X的指针”。

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

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

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

  1. 在C语言中(因此在Objective-C中),在给定指向数组第一个元素的指针的情况下,无法知道此“数组”具有多少个元素。 您必须以某种方式分别获取此信息(无论它是一个单独的length参数,以某种结构打包在一起的length和指针,数组中的“ sentinel”值,等等)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM