Пройдите иерархию классов от базы ко всем потомкам - PullRequest
3 голосов
/ 06 марта 2012

В приложении для iOS, которое я пишу, я хочу пересмотреть иерархию классов, чтобы провести инвентаризацию всех подклассов. Мое намерение состоит в том, чтобы использовать каждый тип подкласса в качестве ключа - через NSStringForClass() - в словаре.

Моя мотивация - возможность автоматически обнаруживать все варианты базового класса, чтобы я мог вызывать методы, связанные с этим классом. По причинам разделения труда я предпочитаю не использовать метод переопределения здесь.

Можно ли сделать такой обход? Как это будет работать?

1 Ответ

7 голосов
/ 06 марта 2012

Вот пример. Этот метод возвращает все подклассы, происходящие из класса, которому вы отправляете сообщение.

@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

Измените его при необходимости, сделайте рекурсивные вызовы и т. Д.

...