Objective c 基金会告诉我Objto-C方法是否需要一个特殊的结构返回?

Objective c 基金会告诉我Objto-C方法是否需要一个特殊的结构返回?,objective-c,objective-c-runtime,Objective C,Objective C Runtime,据我所知,Objective-C方法调用基本上是一个带有两个隐藏参数(接收方和选择器)的C函数调用。Objective-C运行时包含一个名为objc_msgSend()的函数,该函数允许以这种方式调用方法。不幸的是,当函数返回结构时,可能需要进行一些特殊处理。有一些神秘的(有些人可能会说是疯狂的)规则控制结构是否像其他值一样返回,或者它是否在隐藏的第一个参数中实际通过引用返回。对于Objective-C,在这些情况下必须使用另一个名为objc_msgSend_stret()的函数 问题:给定一个

据我所知,Objective-C方法调用基本上是一个带有两个隐藏参数(接收方和选择器)的C函数调用。Objective-C运行时包含一个名为objc_msgSend()的函数,该函数允许以这种方式调用方法。不幸的是,当函数返回结构时,可能需要进行一些特殊处理。有一些神秘的(有些人可能会说是疯狂的)规则控制结构是否像其他值一样返回,或者它是否在隐藏的第一个参数中实际通过引用返回。对于Objective-C,在这些情况下必须使用另一个名为objc_msgSend_stret()的函数

问题:给定一个方法,NSMethodSignature或其他什么可以告诉我是否必须使用objc_msgSend()或objc_msgSend_stret()?到目前为止,我们已经发现NSMethodSignature知道这一点,它在调试输出中打印它,但似乎没有公共API


如果你想回答“你到底为什么要这么做?!”,请在回答之前阅读以下内容:

NSMethodSignature
有一个
-methodReturnType
,你可以检查返回类型是否为
结构。这就是您要做的吗?

Objective-C在给定的体系结构上对C使用相同的底层ABI,因为方法只是带有隐式
self
\u cmd
参数的C函数

换句话说,如果您有一种方法:

-(SomeStructType)myMeth:(SomeArgType)arg;
这是一个普通的C函数:

somestructype myMeth(id self、SEL\u cmd、SomeArgType arg);
我很确定你已经知道了,但我只是向其他读者提一下。 换句话说,您想询问libffi或任何类似的库如何为该体系结构返回SomeStructType

结构类型在寄存器中返回的规则始终是 神秘的,有时是疯狂的。ppc32很简单:结构永远不会返回 登记册。i386很简单:sizeof完全相等的结构 到寄存器中的1、2、4或8返回。x86_64更复杂, 包括在FPU中返回浮点结构字段的规则 寄存器,ppc64的规则和例外会让你头晕目眩。 这些血淋淋的细节记录在MacOSXABI指南中,尽管 通常,如果文档和编译器不一致,则 文件是错误的

如果您直接致电objc_msgSend,需要知道是否 对特定的结构类型使用objc_msgSend_stret,我建议 经验方法:编写一行代码调用您的方法, 在您关心的每个体系结构上编译它,并查看 汇编代码以查看编译器使用的分派函数


它确实告诉我返回类型是否是一个结构,但它没有告诉我该结构是在寄存器中返回的,还是通过堆栈上的ref返回的。所以,我仍然不知道我是必须使用objc_msgSend还是objc_msgSend_stret。我明白了。这超出了我的知识范围。大约两周前,我也试图弄清楚这一点,但也找不到比GitHub线程中包含的更多的信息。在其他地方,我看到Greg Parker提出了“经验方法”:在您关心的任何体系结构上编译一些示例,并检查结果。我现在正在尝试确定libclang是否会在这方面有所帮助。