您可能想看看 Objective-C 运行时函数,尤其是objc_msgSend_fpret
.
double objc_msgSend_fpret( id self, SEL op, ... )
它将带有浮点返回值的消息发送到类的实例。
performSelector
方法使用,objc_msgSend
它返回一个id
类型。
例如:
double res = objc_msgSend_fpret( obj, @selector( blah ) );
您需要导入此 objc 运行时标头:
#import <objc/message.h>
编辑
顺便说一句,这里是 ObjC 运行时参考的链接:http:
//developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
编辑 2 - 重要
objc_msgSend_fpret
以不同的方式实现,具体取决于 CPU 架构(基本上是 i386 或 x86_64)。
正如我在评论中所说,这些功能是使用汇编实现的,因此它们的实现取决于 CPU 架构。
在 x86_64 架构下,该函数返回一个long double
.
这就是为什么当您将其分配给double
.
另请注意,有一个 objc_msgSend_fp2ret 函数。
所以,基本上,我之前的例子是行不通的:
double x = objc_msgSend_fpret( obj, @selector( blah ) );
printf( "Val: %f\n", x );
正如您所注意到的,它将打印“NAN”。
为了使它工作,你必须这样做:
long double x = objc_msgSend_fpret( obj, @selector( blah ) );
printf( "Val: %Lf\n", x );
这是一个工作示例:
http://www.eosgarden.com/uploads/misc/fp.m
编译它使用:
gcc -Wall -framework Foundation -o fp fp.m