在 Objective-C 中,有一个名为 SEL
的类型。它的定义如下:
id (*SEL)(id self, SEL _cmd,...);
但是如果我们创建一个返回类型为double
的方法,那么id
类型就不好用了。
Objective-C 运行时如何解决这个问题?
最佳答案
SEL
被定义为 typedef struct objc_selector *SEL;
,所以你错了。
SEL
是一种用于存储选择器的类型,它基本上是方法的“名称”以及一些其他信息。
无论如何,
对于double
返回类型,Objective-C将简单地返回一个double。它不关心 SEL
和 id
是如何声明的。 (就像 printf
但相反:返回值而不是函数参数。)
本示例程序中+[A a]
方法的实现:
@interface A
+ (double)a;
@end
@implementation A
+ (double)a {
return 1.0f;
}
@end
int main() {
double b = [A a];
return 0;
}
给出此程序集输出(这是一个您不知道其生成名称的函数:您不能仅通过其名称来调用它*):
Leh_func_begin0:
## BB#0:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movabsq $1, %rax ; <-- moves 1.0f into the register
cvtsi2sdq %rax, %xmm0 ; <-- converts quadword integer to double precision
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
popq %rbp
ret ; <-- returns control
; afterwards, the _main function gets the return value from the register
Leh_func_end0:
它只返回一个double
,即使double
需要比id
更多的字节。中间它没有被翻译成 C,所以这没有问题。请注意,Objective-C 方法的返回值不是类型安全的。
主函数调用_objc_msgSend
(调用IMP
*指向的“无名”函数)并将其返回值放入b
.
*该函数的地址作为 IMP
类型的变量存储在方法定义中。 IMP
定义id (*IMP)(id, SEL, ...)
。
关于objective-c - 定义为返回 id 的 SEL 如何表示返回 double 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7739744/