【问题标题】:How to completely hide the Xcode warning "Incompatible pointer to integer conversion sending 'id' to parameter of type (...)"?如何完全隐藏 Xcode 警告“不兼容的指向整数转换的指针将 'id' 发送到类型 (...) 的参数”?
【发布时间】:2013-12-01 19:18:15
【问题描述】:

我的类中有一个方法接收@selector 和一个对象(id),并且该特定方法返回一个id(这是我对对象执行@selector 后的返回值我收到了)。

所以,这就是我的方法的return 的内容(这只有一行,我为每种原始类型都有一行:int、short、long 等...):

return [NSNumber numberWithChar:[obj performSelector:sel]];

Xcode 给了我这个警告,这是一个非常好的观点:

指向整数转换的不兼容指针将“id”发送到参数 'char'类型的

但是,问题是,在我执行上面的return 和根据NSNumber-numberWith... 之前,我确保[obj performSelector:sel] 返回的值的类型是正确的,所以我想要隐藏 Xcode 的警告,因为它对我没有任何帮助。

我已经尝试[NSNumber numberWithChar:[[obj performSelector:sel] charValue]] 来解决警告(这使警告消失了)但是我的程序现在崩溃了,新的charValue

关于如何隐藏错误(无论是什么类型)或如何修复它的任何想法?
谢谢!

【问题讨论】:

标签: objective-c xcode macos warnings primitive-types


【解决方案1】:

performSelector: 的文档包含答案:

对于返回对象以外的任何内容的方法,请使用NSInvocation

不同类型的值可能会以不同的方式返回(使用不同的寄存器、在堆栈上等)。您要做的是采用定义为返回 id 的选择器并将结果视为其他(原始)类型。它可能工作,但保证或要求工作。

所以不要隐藏尝试隐藏错误,修复你的代码!

【讨论】:

    【解决方案2】:

    嗯,一般的解决方法是使用显式消息发送而不是performSelector:,因为performSelector: 期望该方法返回一个对象,并且当该方法返回其他内容时并不总是正确工作。所以你想要return [NSNumber numberWithChar:[obj whateverSelContains]]

    但是,您可以在这里使用键值编码代替performSelector:。如果没有看到您的真实代码,很难说,但假设这是一个返回 char 的无参数方法,那么该方法应该有效。在这种情况下,您需要一个字符串而不是 SEL。然后你可以做[[obj valueForKey:whateverWasInSel] charValue],这样就可以了。

    【讨论】:

      【解决方案3】:

      您真的不想忽略这些警告。如果它们实际上是无效的,您应该使用 C 转换来“隐藏”警告。

      如果这是其中一种情况,请执行以下操作:

      return [NSNumber numberWithChar:(char)[obj performSelector:sel]];
      

      我不知道performSelector: 会返回一个非对象,我很确定文档说在这种情况下使用NSInvocation,但我找不到它 ATM,如果我找到它会更新。

      编辑:The docs 确实说要使用 NSInvocation 用于不返回 Objective-c 对象的方法。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多