如何获得协议定义的函数列表?

时间:2012-07-22 17:54:55

标签: objective-c reflection

我知道在Objective-C运行时中定义了protocol_copyMethodDescriptionList,但我不想这么深,或者使用c-arrays。有没有Protocol对象的方法可以做到这一点?我在哪里可以找到Protocol对象的任何文档?我希望有类似的东西:

[foo getMethodsThisProtocolDefines];

其中foo是Protocol

3 个答案:

答案 0 :(得分:5)

自Leopard / ObjC 2.0以来,Protocol类已被弃用。*因此,它上面没有方法,也没有任何当前文档。与协议交互的唯一方法是通过运行时函数。

协议方法列表中包含的结构也不是对象,因此无法在不被包装的情况下进入NSArray

处理从protocol_copyMethodDescriptionList()返回的数组并不是特别困难;你只需要记住它free()。如果您有特定的选择器,您还可以使用protocol_getMethodDescription()检查协议,这不需要您进行任何内存管理。例如:

BOOL method_description_isNULL(struct objc_method_description desc)
{
    return (desc.types == NULL) && (desc.name == NULL);
}

const char * procure_encoding_string_for_selector_from_protocol(SEL sel, Protocol * protocol)
{
    static BOOL isReqVals[4] = {NO, NO, YES, YES};
    static BOOL isInstanceVals[4] = {NO, YES, NO, YES};
    struct objc_method_description desc = {NULL, NULL};
    for( int i = 0; i < 4; i++ ){
        desc = protocol_getMethodDescription(protocol,
                                             sel,
                                             isReqVals[i], 
                                             isInstanceVals[i]);
        if( !method_description_isNULL(desc) ){
            break;
        }
    }

    return desc.types;
}

*实际上,似乎(基于运行时引用中的a note)该名称现在只是Class的别名。

答案 1 :(得分:1)

你可能想要Objective-C运行时的this. Objective-C包装器。

答案 2 :(得分:1)

从Objective-C运行时检查protocol_copyMethodDescriptionList。这将返回协议上的一系列方法。