遍历从基础到所有后代的类层次结构

时间:2012-03-06 16:31:07

标签: objective-c introspection class-hierarchy

在我正在编写的iOS应用程序中,我想遍历一个类层次结构来制作所有子类的清单。我的意图是在字典中使用每个子类类型作为键 - 通过NSStringForClass()

我的动机是能够自动发现基类的所有变体,以便我可以调用与该类相关的方法。出于分工的原因,我不想在这里使用方法覆盖。

是否可以进行这样的遍历?它会如何运作?

1 个答案:

答案 0 :(得分: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

根据需要修改它,进行递归调用等。