从基础遍历到所有后代的类层次结构 [英] Traverse a class hierarchy from base to all descendants

查看:94
本文介绍了从基础遍历到所有后代的类层次结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在编写iOS应用程序时,我想遍历类层次结构以列出所有子类的清单.我的目的是在字典中通过NSStringForClass()将每个子类类型用作键.

In an iOS app I am writing I want to traverse a class hierarchy to make an inventory of all subclasses. My intent is to use each subclass type as a key -- via NSStringForClass() -- in a dictionary.

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

My motivation is to be able to automatically discover all variants of a base class so that I can call methods associated with that class. For reasons of division of labor I prefer not to use method overriding here.

是否可以进行这种遍历?它将如何工作?

Is it possible to do such a traversal? How would it work?

推荐答案

下面是一个示例.此方法将返回从您向其发送消息的类继承的所有子类.

Here's an example. This method will return all subclasses descending from the class you send the message to.

@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

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

Modify it as needed, make recursive calls, etc.

这篇关于从基础遍历到所有后代的类层次结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆