4

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

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

运行时函数protocol_getMethodDescription返回 a struct objc_method_description,文档中的任何地方都没有描述。不过,它位于公共标头中—— <objc/runtime.h>

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

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

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

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

4

1 回答 1

5

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

于 2012-01-09T20:57:18.997 回答