api
Class isa OBJC_ISA_AVAILABILITY;
Class super_class OBJC2_UNAVAILABLE;
OBJC_EXPORT Class class_getSuperclass(Class cls)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
OBJC_EXPORT Class class_setSuperclass(Class cls, Class newSuper)
__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_5, __IPHONE_2_0,__IPHONE_2_0);
OBJC_EXPORT BOOL class_isMetaClass(Class cls)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
应用
@interface FBAnimal : NSObject
@end
@implementation FBAnimal
@end
@interface FBDog : FBAnimal
@end
@implementation FBDog
@end
- (void)class_arch
{
NSObject *object = [[NSObject alloc] init];
FBAnimal *animal = [[FBAnimal alloc] init];
FBDog *dog = [[FBDog alloc] init];
Class objectClsObj = object_getClass(object);
Class objectClsObj_isa = object_getClass(objectClsObj);
Class animalClsObj = object_getClass(animal);
Class animalClsObj_isa = object_getClass(animalClsObj);
Class dogClsObj = object_getClass(dog);
Class dogClsObj_isa = object_getClass(dogClsObj);
NSLog(@"objectClsObj is meta class = %d, objectClsObj_isa is meta class = %d", class_isMetaClass(objectClsObj), class_isMetaClass(objectClsObj_isa));
NSLog(@"animalClsObj is meta class = %d, animalClsObj_isa is meta class = %d", class_isMetaClass(animalClsObj), class_isMetaClass(animalClsObj_isa));
NSLog(@"dogClsObj is meta class = %d, dogClsObj_isa is meta class = %d", class_isMetaClass(dogClsObj), class_isMetaClass(dogClsObj_isa));
Class objectClsObj_isa_isa = object_getClass(objectClsObj_isa);
Class animalClsObj_isa_isa = object_getClass(animalClsObj_isa);
Class dogClsObj_isa_isa = object_getClass(dogClsObj_isa);
NSLog(@"objectClsObj = %p, objectMetaClsObj = %p, objectMetaClsObj_isa = %p", objectClsObj, objectClsObj_isa, objectClsObj_isa_isa);
NSLog(@"animalClsObj = %p, animalMetaClsObj = %p, animalMetaClsObj_isa = %p", animalClsObj, animalClsObj_isa, animalClsObj_isa_isa);
NSLog(@"dogClsObj = %p, dogMetaClsObj = %p, dogMetaClsObj_isa = %p", dogClsObj, dogClsObj_isa, dogClsObj_isa_isa);
Class objectClsObjSuper = class_getSuperclass(objectClsObj);
Class objectMetaClsObjSuper = class_getSuperclass(objectClsObj_isa);
Class animalClsObjSuper = class_getSuperclass(animalClsObj);
Class animalMetaClsObjSuper = class_getSuperclass(animalClsObj_isa);
Class dogClsObjSuper = class_getSuperclass(dogClsObj);
Class dogMetaClsObjSuper = class_getSuperclass(dogClsObj_isa);
NSLog(@"objectClsObjSuper = %p, objectMetaClsObjSuper = %p", objectClsObjSuper, objectMetaClsObjSuper);
NSLog(@"animalClsObjSuper = %p, animalMetaClsObjSuper = %p", animalClsObjSuper, animalMetaClsObjSuper);
NSLog(@"dogClsObjSuper = %p, dogMetaClsObjSuper = %p", dogClsObjSuper, dogMetaClsObjSuper);
}
output:
objectClsObj is meta class = 0, objectClsObj_isa is meta class = 1
animalClsObj is meta class = 0, animalClsObj_isa is meta class = 1
dogClsObj is meta class = 0, dogClsObj_isa is meta class = 1
objectClsObj = 0x10a5bc170, objectMetaClsObj = 0x10a5bc198, objectMetaClsObj_isa = 0x10a5bc198
animalClsObj = 0x109d5c2b8, animalMetaClsObj = 0x109d5c290, animalMetaClsObj_isa = 0x10a5bc198
dogClsObj = 0x109d5c308, dogMetaClsObj = 0x109d5c2e0, dogMetaClsObj_isa = 0x10a5bc198
objectClsObjSuper = 0x0, objectMetaClsObjSuper = 0x10a5bc170
animalClsObjSuper = 0x10a5bc170, animalMetaClsObjSuper = 0x10a5bc198
dogClsObjSuper = 0x109d5c2b8, dogMetaClsObjSuper = 0x109d5c290
总结
- object_getClass获取id(Class)的Class isa成员值
- instance object的Class isa指向class object
- class object的Class isa指向meta-class object
- meta-class object的Class isa指向root meta-class object
- root class object的Class super_class指向Nil
- root meta-class object的Class super_class指向root class object