2

Objective-C ランタイムで定義されていることは知っていprotocol_copyMethodDescriptionListますが、それほど深く掘り下げたり、C 配列を操作したりする必要はありません。Protocolこれを行うことができるオブジェクトのメソッドはありますか? Protocolオブジェクトのドキュメントはどこにありますか? 私は次のようなことを望んでいます:

[foo getMethodsThisProtocolDefines];

foo はProtocolです。

4

3 に答える 3

5

このProtocolクラスは Leopard/ObjC 2.0 から廃止されました。* したがって、このクラスにはメソッドも現在のドキュメントもありません。プロトコルと対話する唯一の方法は、ランタイム関数を使用することです。

プロトコルのメソッド リストに含まれる構造体もオブジェクトではないため、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;
}

*実際、(ランタイム リファレンスのメモに基づいて) 名前はClass.

于 2012-07-22T18:38:24.067 に答える
1

あなたはおそらくこれを望んでいます。Objective-C ランタイムの Objective-C ラッパー。

于 2012-07-22T18:04:51.770 に答える