获取NSMethodSignature的返回类型

时间:2012-10-10 16:00:27

标签: objective-c

我需要检查NSInvocation的返回类型以查看它是否是一个对象(从那里我可以使用isKindOfClass:来检查对象的确切类型)。我看到NSInvocation有一个NSMethodSignature,而后者methodReturnType。但是,文档提供了以下警告:

  

此编码是特定于实现的,因此应用程序应谨慎使用它。

那么,如何安全地检查返回类型是否为对象?是否有@encode(type-name)的解码变体?

1 个答案:

答案 0 :(得分:4)

总之,你不能。至少,不是100%的保真度。

对于简单类型,如双精度,浮点数,整数,ID等等,您可以检查返回类型,然后以特定于平台的方式处理它。对于更复杂的类型 - 结构,C ++对象等... - 你可以沿着试图弄清楚C ABI如何在每个ABI基础上布局数据的路径,但是你最终会在这个过程中重新发明编译器。

幸运的是,有一些非常全面的例子说明了这一切是如何运作的。 PyObjC和RubyCocoa(MacRuby)项目都是开源的,并为任意返回值提供相对完整的支持。相对;你仍然会被复杂的类型所吸引。

总而言之,Objective-C在调度时是纯动态的,但在参数传递和返回值方面是非常多的C派生静态语言。


错过了你的最后一句话。咖啡之前的derp很强。

这是set of characters that might be returned by methodReturnType

您将寻找@。鉴于methodReturnType返回const char *,您可能会遇到对象返回类型返回的不仅仅是@的情况;可能有修饰符附加到它。你必须测试一大堆方法的返回类型,看看是否真的如此(多年来所述元数据的生成发生了变化,并且还受到方法声明中各种关键字的使用的影响)。

但是,大部分时间 @足以得出结论它是一个对象返回类型。对于你自己声明的方法,Most会增加真实性(从编译器的角度来看,你希望不会做任何奇怪的事情)。