3

私が書いているiOSアプリでは、クラス階層をトラバースして、すべてのサブクラスのインベントリを作成したいと思います。私の意図は、各サブクラスタイプをNSStringForClass()辞書のキーとして(経由して)使用することです。

私の動機は、基本クラスのすべてのバリアントを自動的に検出して、そのクラスに関連付けられたメソッドを呼び出せるようにすることです。分業の理由から、私はここでオーバーライドするメソッドを使用しないことを好みます。

そのようなトラバーサルを行うことは可能ですか?それはどのように機能しますか?

4

1 に答える 1

7

これが例です。このメソッドは、メッセージの送信先のクラスの子孫であるすべてのサブクラスを返します。

@interface NSObject (Debugging)

+ (NSArray *) allSubclasses;

@end

@implementation NSObject (Debugging)

+ (NSArray *) allSubclasses
{
    Class myClass = [self class];
    NSMutableArray *mySubclasses = [NSMutableArray array];

    unsigned int numOfClasses;
    Class *classes = objc_copyClassList(&numOfClasses);
    for (unsigned int ci = 0; ci < numOfClasses; ci++) {
        // Replace the code in this loop to limit the result to immediate subclasses:
        // Class superClass = class_getSuperclass(classes[ci]);
        // if (superClass == myClass)
        //  [mySubclasses addObject: classes[ci]];
        Class superClass = classes[ci];
        do {
            superClass = class_getSuperclass(superClass);
        } while (superClass && superClass != myClass);

        if (superClass)
            [mySubclasses addObject: classes[ci]];
    }
    free(classes);

    return mySubclasses;
}

@end

必要に応じて変更したり、再帰呼び出しを行ったりします。

于 2012-03-06T16:42:05.047 に答える