我需要检查 an 的返回类型NSInvocation
以查看它是否是一个对象(从那里我可以isKindOfClass:
用来检查对象的确切类型)。我看到NSInvocation
有一个NSMethodSignature
,而后者又有methodReturnType
。但是,文档给出了以下警告:
此编码是特定于实现的,因此应用程序应谨慎使用它。
那么,如何安全地检查返回类型是否为对象?是否有解码变体@encode(type-name)
?
我需要检查 an 的返回类型NSInvocation
以查看它是否是一个对象(从那里我可以isKindOfClass:
用来检查对象的确切类型)。我看到NSInvocation
有一个NSMethodSignature
,而后者又有methodReturnType
。但是,文档给出了以下警告:
此编码是特定于实现的,因此应用程序应谨慎使用它。
那么,如何安全地检查返回类型是否为对象?是否有解码变体@encode(type-name)
?
简而言之,你不能。至少,不是 100% 的保真度。
对于像双精度、浮点数、整数、ID 等这样的简单类型……您可以检查返回类型,然后以特定于平台的方式处理它。对于更复杂的类型——结构、C++ 对象等……——你可以尝试弄清楚 C ABI 究竟是如何在每个 ABI 的基础上布置数据的,但是您最终将在此过程中重新发明编译器。
幸运的是,有一些非常全面的例子来说明这一切是如何工作的。PyObjC 和 RubyCocoa (MacRuby) 项目都是开源的,并且为任意返回值提供了相对完整的支持。相对地; 你仍然会被复杂的类型所困扰。
总而言之,Objective-C 在调度时是纯动态的,但在参数传递和返回值方面,它是一种 C 派生的静态语言。
错过了你的最后一句话。在咖啡之前,derp很浓。
这是可能由 . 返回的字符集methodReturnType
。
你会寻找@
. 鉴于methodReturnType
返回 a const char *
,您可能会遇到对象返回类型返回的不仅仅是@
;的情况。可能附加了修饰符。您必须测试大量方法的返回类型以查看是否确实如此(所述元数据的生成多年来发生了变化,并且还受到方法声明中使用各种关键字的影响)。
但是,大多数时候 @
足以断定它是一个对象返回类型。 Most
将增加您自己声明的方法的真实性(从编译器的角度来看,希望您不要做任何非常奇怪的事情)。