2

过去,当我不得不在 Snow Leopard(或任何较旧的 Mac OS X)上编译某些东西并使用 Lion 及更高版本上可用的一些 @selector 时,我做了这样的事情:

if([foo respondsToSelector:@selector(awesomeLionSelector)]) {
    [foo awesomeLionSelector]
}

这效果很好。所以,现在我正在尝试对一个返回浮点数的新方法做同样的事情,但是下面的行:

float f = [foo awesomeLionSelectorWhichReturnsFloat];

引发编译错误:“无法在赋值中将 'objc_object*' 转换为 'float'”。这是因为编译器不知道该方法并且必须假定返回类型为“id”。

解决此问题的正确方法是什么?

4

2 回答 2

2

不是最优雅的修复,但仍然是一个修复。

#ifdef SnowLeopard
float f = [foo awesomeLionSelectorWhichReturnsFloat];
#endif
于 2012-06-21T17:38:10.847 回答
2

编辑:根据 John Caswell 的评论,要使用的正确运行时函数是objc_msgSend_fpret(),它返回一个双精度值。

我认为您应该尝试以下方式:objc_msgSend_stret()

objc_msgSend_stret

将带有数据结构返回值的消息发送到类的实例。

  void objc_msgSend_stret(void * stretAddr, id theReceiver, SEL theSelector,  ...)

就像是:

objc_msgSend_stret(&myFloatReturnValue, foo, @selector(awesomeLionSelector));
于 2012-06-21T17:39:18.710 回答