2

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

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

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

4

1 回答 1

4

简而言之,你不能。至少,不是 100% 的保真度。

对于像双精度、浮点数、整数、ID 等这样的简单类型……您可以检查返回类型,然后以特定于平台的方式处理它。对于更复杂的类型——结构、C++ 对象等……——你可以尝试弄清楚 C ABI 究竟是如何在每个 ABI 的基础上布置数据的,但是您最终将在此过程中重新发明编译器。

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

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


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

这是可能由 . 返回的字符集methodReturnType

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

但是,大多数时候 @足以断定它是一个对象返回类型。 Most将增加您自己声明的方法的真实性(从编译器的角度来看,希望您不要做任何非常奇怪的事情)。

于 2012-10-10T16:07:41.663 回答