如果函数是用原型定义的,该原型明确说明了参数的类型,例如.
void somefunc(int arg1, float arg2);
Run Code Online (Sandbox Code Playgroud)
但实施为
void somefunc(int arg1, ...) { ... }
Run Code Online (Sandbox Code Playgroud)
是否可以使用va_arg来检索浮点数?它通常被禁止这样做,因为varargs函数具有隐式类型提升,例如float to double,因此尝试检索未启动类型是不受支持的,即使使用未启动类型调用函数对更具体的函数原型也是如此.
这样做的原因是在运行时检索不同类型的参数,作为obj-c解释器的一部分,其中一个函数将被重用于所有不同类型的方法.
这最好是独立于架构(因此,如果没有其他相同的代码在模拟器和设备上工作),尽管如果没有办法这样做,那么将接受设备特定的修复.
编辑:忘了具体提到:函数知道参数的类型和数量(它查找要使用SEL _cmd参数进行地图查找解释的代码)