基金会可以告诉我Objective-C方法是否需要特殊的结构返回?

Eri*_*urg 9 objective-c objective-c-runtime

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

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

如果你想回答"你为什么要这样做?!",请在阅读之前阅读以下内容:https://github.com/erikdoe/ocmock/pull/41

小智 0

Objective-C 在给定架构上使用与 C 相同的底层 ABI,因为方法只是带有隐式self_cmd参数的 C 函数。

换句话说,如果你有一个方法:

- (SomeStructType)myMeth:(SomeArgType)arg;
Run Code Online (Sandbox Code Playgroud)

那么这实际上是一个普通的 C 函数:

SomeStructType myMeth(id self, SEL _cmd, SomeArgType arg);
Run Code Online (Sandbox Code Playgroud)

我很确定您已经知道这一点,但我只是向其他读者提及。换句话说,您想询问 libffi 或任何类型的类似库如何SomeStructType返回该架构。