objective-c - Foundation 可以告诉我 Objective-C 方法是否需要特殊结构返回吗?

标签 objective-c objective-c-runtime

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

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

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

最佳答案

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

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

- (SomeStructType)myMeth:(SomeArgType)arg;

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

SomeStructType myMeth(id self, SEL _cmd, SomeArgType arg);

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

关于objective-c - Foundation 可以告诉我 Objective-C 方法是否需要特殊结构返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143636/

相关文章:

objective-c - 在 Objective-C 中获取方法参数的类

c++ - 在编译时返回唯一字符串的宏

objective-c - 在运行时确定 Objective-C 方法是否可变

objective-c - iOS 检测类是 Objective-C 还是 Swift

ios - Cloudkit 为每个用户提供不同的记录类型?

iphone - 如何持续获取Http响应而不崩溃?

objective-c - 如何将 Storyboard合并到 cocos2d 2.0 项目中?

ios - 使用AFNetworking计算下载多个文件的总进度

objective-c - class_addIvar 的对齐在 Objective-C 中有什么作用?

ios - 基于 3 个 NSPredicates 动态过滤数组