【问题标题】:Get object array argument from NSInvocation with ARC使用 ARC 从 NSInvocation 获取对象数组参数
【发布时间】:2014-04-22 18:15:49
【问题描述】:

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

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

【问题讨论】:

  • 为什么不用NSArray?
  • 公平的问题,但我希望 API 表示它需要一个 MyInt 对象数组。 NSArray 将允许某人传入任何对象。
  • 我仍然可以传递任何对象。只需使用 NSArray 让您的生活更轻松。

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


【解决方案1】:

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

在 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 指针。

【讨论】:

  • 非常感谢!这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
相关资源
最近更新 更多