Objective c 具有标量返回值的目标C选择器不可用

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

过去,当我不得不在Snow Leopard(或任何较旧的Mac OS X)上编译一些东西,并使用Lion和更高版本上提供的@selector时,我做了如下工作:

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];将在运行时崩溃。使用简单的cast
float f=(float)[foo awesomelionselector whichreturnsfloat]会发生什么?几乎相同的错误:从类型“objc_object*”到类型“float”的转换无效@rishi这不会破坏Lion的代码吗?@JoshCaswell我就是这么想的。是的,float f=[f1 floatValue];将在运行时崩溃。该方法不返回
struct
;如果要执行此路径,正确的函数是,并且使用直接返回值;如果你要走这条路线,正确的函数是,你使用直接返回值。