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

Jos*_*ell 4 protocols objective-c objective-c-runtime method-signature

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

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

运行时函数protocol_getMethodDescription返回a struct objc_method_description,文档中的任何位置都没有描述.它位于公共标题中,但是 - <objc/runtime.h>:

struct objc_method_description {
    SEL name;
    char *types;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lil*_*ard 5

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