//Test.m @implementation Test #define ClsLog(tag, cls, isaCls) NSLog(@"%30s %s<%p>, isa:%s<%p>", tag, class_getName(cls), cls, object_getClassName(cls), isaCls) - (void)test { Class cls = [self class]; Class isaCls = object_getClass(cls); ClsLog("[self class]", cls, isaCls); cls = [super class]; isaCls = object_getClass(cls); ClsLog("[super class]", cls, isaCls); cls = [self superclass]; isaCls = object_getClass(cls); ClsLog("[self superclass]", cls, isaCls); cls = [super superclass]; isaCls = object_getClass(cls); ClsLog("[super superclass]", cls, isaCls); cls = [Test superclass]; isaCls = object_getClass(cls); ClsLog("[Test superclass]", cls, isaCls); cls = [Test class]; isaCls = object_getClass(cls); ClsLog("[Test class]", cls, isaCls); cls = objc_getMetaClass("Test"); isaCls = object_getClass(cls); ClsLog("[Test meta]", cls, isaCls); cls = objc_getMetaClass(object_getClassName(cls)); isaCls = object_getClass(cls); ClsLog("[Test meta isa]", cls, isaCls); cls = [cls superclass]; isaCls = object_getClass(cls); ClsLog("[Test meta isa superclass]", cls, isaCls); } @end
[self class] Test<0x105e001f8>, isa:Test<0x105e00220> [super class] Test<0x105e001f8>, isa:Test<0x105e00220> [self supercls] NSObject<0x10654dd28>, isa:NSObject<0x10654dd50> [super supercls] NSObject<0x10654dd28>, isa:NSObject<0x10654dd50> [Test supercls] NSObject<0x10654dd28>, isa:NSObject<0x10654dd50> [Test class] Test<0x105e001f8>, isa:Test<0x105e00220> [Test meta] Test<0x105e00220>, isa:NSObject<0x10654dd50> [Test meta isa] NSObject<0x10654dd50>, isa:NSObject<0x10654dd50> [Test meta isa supercls] NSObject<0x10654dd28>, isa:NSObject<0x10654dd50>
//runtime/NSObject.mm @implementation NSObject + (Class)class { return self; } - (Class)class { return object_getClass(self); } + (Class)superclass { return self->superclass; } - (Class)superclass { return [self class]->superclass; } @end //runtime/objc-class.mm Class object_getClass(id obj) { if (obj) return obj->getIsa(); else return Nil; } //// const char *object_getClassName(id obj) { return class_getName(obj ? obj->getIsa() : nil); } const char *class_getName(Class cls) { if (!cls) return "nil"; assert(cls->isRealized() || cls->isFuture()); return cls->demangledName(); }