如何完全隐藏Xcode警告"指向整数转换的指针不兼容发送' id'到类型(...)的参数"?

时间:2013-12-01 19:18:15

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

我的类中有一个接收@selector和一个对象(id)的方法,该特定方法返回id(这是我执行后的返回值)我收到的物品@selector。)
所以,这就是我对我的方法的return所拥有的(这只是一行,每个基本类型都有一行:int,short,long等等):

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

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

  

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

但是,问题是,在我使用相应return的{​​{1}}执行上面的NSNumber之前,我确保-numberWith...返回的值的类型是正确的,所以我想隐藏Xcode的警告,因为它对我没有任何帮助。

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

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

3 个答案:

答案 0 :(得分:4)

performSelector:的文档包含答案:

  

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

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

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

答案 1 :(得分:3)

好吧,一般修复是使用显式消息发送而不是performSelector:,因为performSelector:期望方法返回一个对象,并且当方法返回其他内容时不会始终正常工作。所以你想要return [NSNumber numberWithChar:[obj whateverSelContains]]

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

答案 2 :(得分:1)

你真的不想忽视这些警告。如果它们实际上无效,您应该使用C演员来隐藏'警告。

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

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

我不知道performSelector:会返回非对象,我非常确定文档会说NSInvocation用于此类情况,但我找不到ATM,如果我这样做会更新。

修改:The docs确实说要将NSInvocation用于不返回objective-c对象的方法。