如果这是返回类型的运行时发现,您可以使用 ObjC 运行时 API 来查找给定对象方法的方法定义,然后返回类型。具体方法:
Method class_getInstanceMethod(Class aClass, SEL aSelector)
或者
Method class_getClassMethod(Class aClass, SEL aSelector)
将为您提供一个Method
结构,您随后可以使用该结构进行查询
void method_getReturnType(Method method, char *dst, size_t dst_len)
获取返回类型的 cstring 描述。此描述不太适合人类阅读 - 例如,在您的示例中,您需要检查引用的字符串*dst
是否等于“@”。如果是,则返回类型为 type id
。您可以在此处查看对不同类型编码的引用,以及我在此处提到的 ObjC 运行时 API 方法。
正如 H2C03 所提到的,当推断出的返回类型表明它们的使用是合适的时(例如,当返回类型是结构或浮点数时,应该使用objc_msgSend_fpret
and变体。请参阅 ObjC 运行时 API 文档上关于这两种方法的文档说明页。)objc_msgSend_stret
method_getReturnType
另外,因为我希望你有一个美好的一天,我觉得我应该警告你运行时代码发现通常有点脆弱,通常是一种令人讨厌的性能气味。无论如何。:)