objective-c - 定义为返回 id 的 SEL 如何表示返回 double 的方法?

标签 objective-c types selector return-type

在 Objective-C 中,有一个名为 SEL 的类型。它的定义如下:

id (*SEL)(id self, SEL _cmd,...);

但是如果我们创建一个返回类型为double的方法,那么id类型就不好用了。

Objective-C 运行时如何解决这个问题?

最佳答案

SEL 被定义为 typedef struct objc_selector *SEL;,所以你错了。

SEL 是一种用于存储选择器的类型,它基本上是方法的“名称”以及一些其他信息。


无论如何,

对于double返回类型,Objective-C将简单地返回一个double。它不关心 SELid 是如何声明的。 (就像 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/

相关文章:

iphone - 移除导航栏和按钮上的白色渐变

objective-c - 如何删除应用程序可访问的所有钥匙串(keychain)项目?

javascript - 如何识别原型(prototype)类型?

java - 创建通用列表,其中列表的类型仅在运行时已知

sql - 在 MySQL 中更改列数据类型时如何保留数据?

jquery - 使用属性 End With 删除元素

objective-c - UIPanGestureRecognizer 坐标限制

iphone - 替换为 view2 后删除 View 1

android - 如何覆盖 Sherlock 操作栏中的按下状态颜色?

iphone - 修改plist不起作用