BOOL class_isKindOfClass(Class cls1, Class cls2) { objc_initialize_class(cls1); objc_initialize_class(cls2); Class iter; for (iter = cls1; iter != Nil; iter = iter->superclass) if (iter == cls2) return YES; return NO; }
unsigned long class_getInstanceSize(Class cls) { objc_initialize_class(cls); return cls->instance_size; }
Method class_getInstanceMethod(Class cls, SEL name) { objc_global_mutex_lock(); objc_initialize_class(cls); Method m = NULL; _class_lookupMethodImplementation(cls, name, &m); objc_global_mutex_unlock(); return m; }
Property class_getProperty(Class cls, const char* name) { if (cls && name) { objc_initialize_class(cls); for (struct objc_property_list* propList = cls->properties; propList != NULL; propList = propList->next) { for (unsigned i = 0; i < propList->count; ++i) { Property currentProperty = &propList->properties[i]; if (strcmp(currentProperty->name, name) == 0) { return currentProperty; } } } } return NULL; }
Ivar class_getInstanceVariable(Class cls, const char* name) { objc_initialize_class(cls); struct objc_ivar_list* list = (struct objc_ivar_list*)cls->ivars; if (list) { for (unsigned i = 0; i < list->count; i++) { struct objc_ivar* curIvar = &list->ivars[i]; if (strcmp(curIvar->name, name) == 0) { return curIvar; } } } return NULL; }
Class class_getSuperclass(Class cls) { objc_initialize_class(cls); return cls->superclass; }