我的类中有一个接收@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]]
。
关于如何隐藏错误(无论是什么类型)或如何修复它的任何想法?
谢谢!
答案 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对象的方法。