2

代码:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
BOOL initial = YES;
[invocation setArgument:&initial atIndex:2];

问题:

是否可以在不创建临时变量的情况下传递YES给?setArgument:atIndex:

我在想,也许有一种我不知道的语言结构和/或在运行时是不变的YES,我总是可以指出。

谢谢!

4

3 回答 3

6

不,不是以任何干净、可靠的方式。

NSInvocation 将取消引用您发送的任何指针,并从中复制方法签名指定长度的数据。您需要在某处拥有该信息,以便获得地址,并且拥有本地变量是最好的方法。

于 2012-06-16T06:25:16.040 回答
0

指针必须指向某些东西(包括垃圾)或什么都没有(意味着指针被初始化为 NULL)。指针是对对象的间接引用。如果您的指针没有这样的对象指向,您可能不需要指针。您可以简单地调用setArgument:NULL atIndex:2.

在代码中使用类似指针的情况是传递一个输出参数,其值将在您调用的函数中设置,在这种情况下,您可能不需要在将参数传递给函数之前对其进行初始化,该函数应该负责为其分配正确的值。

因此,在您的情况下,如果您不是要使用输出参数,则只需将原始 BOOL 传递给函数,不需要指针。

编辑

我刚刚查看了 NSInvocation 的文档。答案和其他人一样,NO。

您必须传递一个指针,该指针必须指向现有对象,NSInvocation 才能正常工作。

于 2012-06-16T06:07:16.987 回答
0

答案是不。指针必须指向内存中的地址。因此,首先您必须分配该内存,然后将该分配的内存的地址发送到该方法中。在原语的情况下,分配的内存将在堆栈上,而对于对象,为该对象分配的内存将在堆上,并且该对象的地址将存储在堆栈上。至于你得到的void*参数setArgument:atIndex:似乎想要一个对象而不是原始的错误。您是否尝试过使用 aNSNumber来表示布尔值。NSNumber自带一个numberWithBool:方法。

于 2012-06-16T06:29:05.717 回答