Objective c 具有标量返回值的目标C选择器不可用
过去,当我不得不在Snow Leopard(或任何较旧的Mac OS X)上编译一些东西,并使用Lion和更高版本上提供的@selector时,我做了如下工作:Objective c 具有标量返回值的目标C选择器不可用,objective-c,Objective C,过去,当我不得不在Snow Leopard(或任何较旧的Mac OS X)上编译一些东西,并使用Lion和更高版本上提供的@selector时,我做了如下工作: if([foo respondsToSelector:@selector(awesomeLionSelector)]) { [foo awesomeLionSelector] } 这非常有效。因此,现在我尝试对一个新方法执行相同的操作,该方法返回一个float,但如下所示: float f = [foo awesomeLion
if([foo respondsToSelector:@selector(awesomeLionSelector)]) {
[foo awesomeLionSelector]
}
这非常有效。因此,现在我尝试对一个新方法执行相同的操作,该方法返回一个float,但如下所示:
float f = [foo awesomeLionSelectorWhichReturnsFloat];
引发编译错误:“无法在赋值中将'objc_object*'转换为'float'。这是因为编译器不知道该方法,必须假定返回类型为“id”
解决这个问题的正确方法是什么?不是最优雅的解决方法,但仍然是一种解决方法
#ifdef SnowLeopard
float f = [foo awesomeLionSelectorWhichReturnsFloat];
#endif
不是最优雅的修复,但修复仍然如此
#ifdef SnowLeopard
float f = [foo awesomeLionSelectorWhichReturnsFloat];
#endif
编辑:根据John Caswell的评论,要使用的正确运行时函数是
objc\u msgSend\u fpret()
,它返回一个双精度值
我认为你应该试试你的方式::
objc_msgSend_stret
向类的实例发送带有数据结构返回值的消息
void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector, ...)
比如:
objc_msgSend_stret(&myFloatReturnValue, foo, @selector(awesomeLionSelector));
编辑:根据John Caswell的评论,要使用的正确运行时函数是
objc\u msgSend\u fpret()
,它返回一个双精度值
我认为你应该试试你的方式::
objc_msgSend_stret
向类的实例发送带有数据结构返回值的消息
void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector, ...)
比如:
objc_msgSend_stret(&myFloatReturnValue, foo, @selector(awesomeLionSelector));
一个简单的cast
float f=(float)[foo awesomelionselector whichreturnsfloat]会发生什么代码>?几乎相同的错误:从类型“objc_object*”到类型“float”的转换无效@rishi这不会破坏Lion的代码吗?@JoshCaswell我就是这么想的。是的,float f=[f1 floatValue];将在运行时崩溃。使用简单的castfloat f=(float)[foo awesomelionselector whichreturnsfloat]会发生什么代码>?几乎相同的错误:从类型“objc_object*”到类型“float”的转换无效@rishi这不会破坏Lion的代码吗?@JoshCaswell我就是这么想的。是的,float f=[f1 floatValue];将在运行时崩溃。该方法不返回struct
;如果要执行此路径,正确的函数是,并且使用直接返回值;如果你要走这条路线,正确的函数是,你使用直接返回值。