gpt4 book ai didi

objective-c - 运行 performSelector : on an object that returns a double, 不是 id

转载 作者:太空狗 更新时间:2023-10-30 03:56:47 27 4
gpt4 key购买 nike

如何在对象上运行任意选择器,返回值是 double?例如,我有一个对象 A,它有方法 -(double)b​​lah;

如何double res = [obj performSelector:@selector(blah)];? performSelector 返回一个 id 类型的对象,所以我应该从 id 转换为 NSInteger 到 double - 这会失去精度吗?

此外,我不想使用obj的methodSignatureForSelector(意思是,没有NSMethodSignatureNSInvocation ) 因为它会在运行时消耗大量 CPU。

最佳答案

您可能想看看 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 运行时 header :

#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 时它会失败(并返回 NAN)的原因。

另请注意,有一个 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

关于objective-c - 运行 performSelector : on an object that returns a double, 不是 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com