美文网首页
获取一个类的所有子类

获取一个类的所有子类

作者: Bel李玉 | 来源:发表于2017-02-13 19:32 被阅读421次

最近公司内部需要做数据统计,公司项目现在进行模块开发,数据采集的功能以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 点击下载.

相关文章

  • 获取一个类的所有子类

    最近公司内部需要做数据统计,公司项目现在进行模块开发,数据采集的功能以SDK的形式进行采集。考虑到SDK的通用性和...

  • IOS 获取父类的所有子类

    1、获取父类的所有子类 -(void)getSubclass { int numClasses; Class *c...

  • 子类对象实例化的全过程

    从结果上看:(继承性)子类继承父类后,就获取了父类中声明的属性或方法创建子类的对象,在堆空间中,就会加载所有父类中...

  • swift学习之构造函数

    1、 子类没有实现父类的任何一个指定构造函数,那么子类将回继承父类的所有指定构造函数2、子类实现了父类的所有指定构...

  • Swift 继承

    继承我们可以理解为一个类获取了另一个类的所有方法和属性。当一个类继承其他类时,继承类叫子类,被继承的类叫超类(或父...

  • ios 通过runtime 获取类对象的所有子类

    oc写法 swift 写法

  • PyQt(三) 类继承结构图

    一. PyQt5 类的继承结构图 二. 如何获取一个类的父类和子类? 使用QObject.mro()获取父类, 使...

  • C++中的多重继承

    多重继承 C++支持编写多重继承的代码一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承所有父类的成员函数...

  • Python:类的继承和导入

    一个类继承另一个类时,会自动获得另一个类的所有属性和方法;原有的来称为父类,新类称为子类。子类继承父类的所有属性和...

  • 获得一个类的所有变量和方法

    获取一个类的所有方法 获取一个类的所有变量

网友评论

      本文标题:获取一个类的所有子类

      本文链接:https://www.haomeiwen.com/subject/csstwttx.html