クラスのすべてのサブクラスを取得

1968 ワード

最近社内でデータ統計が必要で、会社のプロジェクトは現在モジュール開発を行い、データ収集の機能はSDKの形式で採集を行う.SDKの汎用性と低結合性を考慮して,データモデルを作成する際にモデル間多重継承方式を採用した.クラスを使用する場合、modelのクラスメソッドを使用して調整する必要がある場合があります.ある種類の下のすべてのサブクラスを取得する必要があります.再帰的な方法を採用して、1級1級探していきます.
クラスのサブクラスを取得
/**
    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を添付してダウンロードをクリックします.