Skip to content

Instantly share code, notes, and snippets.

@rumandcode
Created November 10, 2013 12:00
Show Gist options
  • Save rumandcode/7397375 to your computer and use it in GitHub Desktop.
Save rumandcode/7397375 to your computer and use it in GitHub Desktop.
Objective-C introspection methods
#import <Foundation/Foundation.h>
/** ClassGetSubclasses
Returns all subclasses for a given class by interrogating every class in the
runtime. Results are cached to save time on repeat calls for the same class.
*/
extern NSArray *ClassGetSubclasses(Class parentClass);
#import "ObjCIntrospect.h"
#import <objc/runtime.h>
static NSMutableDictionary *ClassSubclassesCache;
NSArray *ClassGetSubclasses(Class class) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ClassSubclassesCache = [NSMutableDictionary dictionary];
});
NSMutableArray *result = [ClassSubclassesCache objectForKey:NSStringFromClass(class)];
if (result == nil) {
int numClasses = objc_getClassList(NULL, 0);
Class *classes = NULL;
classes = malloc(sizeof(Class) * numClasses);
numClasses = objc_getClassList(classes, numClasses);
for (NSInteger i = 0; i < numClasses; i++) {
Class superClass = classes[i];
do {
superClass = class_getSuperclass(superClass);
} while(superClass && superClass != class);
if (superClass == nil) {
continue;
}
[result addObject:classes[i]];
}
free(classes);
[ClassSubclassesCache setObject:result forKey:NSStringFromClass(class)];
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment