Search code examples
objective-cintrospectionclass-hierarchy

Traverse a class hierarchy from base to all descendants


In an iOS app I am writing I want to traverse a class hierarchy to make an inventory of all subclasses. My intent is to use each subclass type as a key -- via NSStringForClass() -- in a dictionary.

My motivation is to be able to automatically discover all variants of a base class so that I can call methods associated with that class. For reasons of division of labor I prefer not to use method overriding here.

Is it possible to do such a traversal? How would it work?


Solution

  • Here's an example. This method will return all subclasses descending from the class you send the message to.

    @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
    

    Modify it as needed, make recursive calls, etc.