为协议方法键入编码字符串

时间:2012-01-09 20:50:48

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

我正在尝试为协议中声明的方法获取签名 - 要么是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:)中的对象进行比较。 / p>

1 个答案:

答案 0 :(得分:5)

不推荐使用Protocol作为对象。如果你检查标题<objc/Protocol.h>,你会发现它上面的所有东西要么在OBJC-2中不可用,要么在OS X 10.5中被弃用。您可以按照建议使用protocol_getMethodDescription(),并取出types字段。我不确定它是否已经正式记录,这是该方法的类型编码,但确实如此。