【问题标题】:Type encoding string for protocol method协议方法的类型编码字符串
【发布时间】:2012-01-09 20:50:47
【问题描述】:

我正在尝试为协议中声明的方法获取签名——NSMethodSignature 对象或至少类型编码字符串。

询问Protocol 对象本身是不可能的,因为a) 它没有实现methodSignatureForSelector:,并且b)(如下面的Kevin 所述)它已被弃用。

运行时函数protocol_getMethodDescription 返回一个struct objc_method_description,文档中没有任何描述。不过,它位于公共标头中 -- <objc/runtime.h>:

struct objc_method_description {
    SEL name;
    char *types;
};

假设其中的types 字符串与其他地方使用的签名编码字符串相同,这似乎是合理的,例如+[NSMethodSignature signatureWithObjCTypes:] 所期望的,实际上,它看起来 正确。

我无法追踪的是该字符串与类型编码过程之间的实际、可验证的联系。

我想不出它会是什么,但是,我是否有任何理由依赖这个 types 字符串在同一运行时与其他对象/函数交互有效 ?请注意,我不是自己编写编码字符串,也不是期望它们具有给定的格式或值——我只想将它们从运行时/框架的一部分传递到另一部分,即从协议和一个) 使用它来生成一个 NSMethodSignature 对象,如果一个对象不可用,并且可能 b) 将它与运行时生成的 NSInvocation 进行比较(即在 -forwardInvocation: 中)。

【问题讨论】:

  • 对未来的注意:引发这个问题的一个主要误解是运行时执行方法签名的原始构造,而实际上这是编译器的工作。

标签: objective-c protocols objective-c-runtime method-signature


【解决方案1】:

不推荐使用Protocol 作为对象。如果您检查标题&lt;objc/Protocol.h&gt;,您会发现其上的几乎所有内容要么在 OBJC-2 中不可用,要么在 OS X 10.5 中已被弃用。您可以按照您的建议使用protocol_getMethodDescription(),然后拉出types 字段。我不确定它是否真的被正式记录为方法的类型编码,但确实是这样。

【讨论】:

  • 我想也许我不应该包含关于使用Protocol 对象的那一点,因为我很快就排除了它。感谢您的确认。我找不到该领域的文档-您认为这只是一个“不完整的文档”问题吗?知道在运行时字符串的构造埋在哪里吗?
  • @JoshCaswell:很多底层运行时的东西都没有特别完善的文档记录,但在这种情况下,可以很安全地假设这个types 字段可能除了类型的@encode-string。
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多