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