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