runtime——Class——体系结构

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值