【问题标题】:Pointer to BOOL in Objective CObjective C 中指向 BOOL 的指针
【发布时间】:2012-06-16 05:45:31
【问题描述】:

代码:

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

问题:

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

我在想也许有一个我不知道的语言结构和/或运行时中的常量,我可以指向它总是YES

谢谢!

【问题讨论】:

  • 为什么函数需要一个指向布尔值的指针?当 bool 的值占用更少的空间时,通过地址将 bool 传递给方法似乎有点奇怪。
  • 当我尝试传递 YES 时,它会因“+[NSInvocation invocationWithMethodSignature:]:方法签名参数不能为 nil'”而崩溃。另外,还有一个警告:“不兼容的整数到指针转换将'signed char'发送到'void *'类型的参数”。

标签: objective-c pointers


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!只是想确定一下。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    编辑

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

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

    【讨论】:

    • 我刚刚尝试传递原语BOOL 并引发异常,此外还有编译器警告。查看我对@Sbossb 的回复。
    猜你喜欢
    • 2011-05-19
    • 2010-12-02
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多