【问题标题】:Using NSInvocation setArgument: with value returned from NSArray使用 NSInvocation setArgument:从 NSArray 返回值
【发布时间】:2023-03-03 18:00:01
【问题描述】:

我有以下问题。

我有一个 NSArray 值,我需要循环并将其内容设置为 NSInvocation 对象的相应参数。考虑以下代码:

NSArray *args = @[@"test"];

稍后我想做类似的事情:

for ( i = 0; i < [args count]; i++)
{
    [invocationObj setArgument: [args objectAtIndex: i] atIndex: i+2];
}

但这不起作用。它给出以下警告:

Implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast

调用对象是动态的(对于目标/选择器和 args),因此当我设置相应 invocationObj 的参数时,我不知道 args 数组的内容。有什么办法可以实现吗?

【问题讨论】:

  • 您在调用调用之前设置参数
  • 你的问题到底是什么?
  • “不起作用”是什么意思?给出编译器错误?信号?例外?在分配或调用时?发送错误的论点?不发送消息?
  • 检查invocationObj 不是nil
  • 你有什么异常吗??

标签: ios objective-c


【解决方案1】:

您需要将指针位置传递给setArgument:atIndex:。具体来说,这部分来自文档

当参数值是一个对象时,传递一个指向应该从中复制对象的变量(或内存)的指针:

所以试试这个...

id argument = [args objectAtIndex: i];
[invocationObj setArgument:&argument atIndex: i+2];

【讨论】:

  • 是的,对不起。我不是说他们是一样的。只是 setArguments 接受 void * 其中 id 是其子集。为了清楚起见,删除了。
  • 这很好用,谢谢!一个问题。为什么我不能这样做: [invocationObj setArgument: &[args objectAtIndex: i] atIndex: i+2]; ??
  • 因为编译器不允许对右值表达式进行地址操作。更多解释:stackoverflow.com/a/7370156/98048
  • 完美。非常感谢!
  • 如果数组中有可变数量的元素并且需要更通用的解决方案来设置多个参数,很遗憾,这将不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多