获取一个类的所有子类

最近公司内部需要做数据统计,公司项目现在进行模块开发,数据采集的功能以SDK的形式进行采集。考虑到SDK的通用性和低耦合性,在创建数据model的时候,采用了model之间多重继承的方式。在使用类的时候,有的需要使用 model的 类方法 来调,就需要获得某各类下所有的子类,想到了一个方法,采用递归的方式一级一级的找下去。

获取某一个类的子类

/**
 获取 A类 的所有子类的类名 

 @param defaultClass  A类
 @return 包含所有子类的数组
 */
+ (NSArray *)findAllOf:(Class)defaultClass
{
    int count = objc_getClassList(NULL, 0);
    if (count <= 0)   
    {
        @throw@"Couldn't retrieve Obj-C class-list";
        return [NSArray arrayWithObject:defaultClass];
    }
    NSMutableArray *output = [[NSMutableArray alloc]init];
    Class *classes = (Class *) malloc(sizeof(Class) * count);
    objc_getClassList(classes, count);
    for (int i = 0; i < count; ++i) {
        if (defaultClass == class_getSuperclass(classes[i]))//子类
        {
            [output addObject:classes[i]];
        } 
    }
    free(classes);
    return [NSArray arrayWithArray:output];
}

获取多重继承下的所有类名(递归)

/**
 获取一个类的所有子类, 子类 需要有 impletation 方法

 @param allClasses 类名 需要以 数组 的形式传递
 @return 包含所有类的数组
 */
+ (NSArray *)getAllSubClass:(NSArray *)allClasses{
    __block NSMutableArray * allClassContainArray = [[NSMutableArray alloc]init];
    __weak __typeof(self) weakSelf = self;
    [allClasses enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        __strong __typeof(weakSelf) strongSelf = weakSelf;
        NSArray * clssessArray = [strongSelf findAllOf:obj];
        [allClassContainArray addObjectsFromArray:clssessArray];
    }];
    if (allClassContainArray.count == 0) {
        return  allClassContainArray;
    }else{
        return [allClassContainArray arrayByAddingObjectsFromArray:[self getAllSubClass:allClassContainArray]];
    }
}

获得一个类的所有类名 需要 该类 有 @implementation 方法 才可

在这里感谢 http://www.cnblogs.com/zhidao-chen/archive/2013/03/22/2975792.html 提供的思路
另外 附上我写的一个小demo 点击下载.

你可能感兴趣的:(获取一个类的所有子类)