美文网首页
OC对象的isa指针指向哪里?

OC对象的isa指针指向哪里?

作者: 程序猿_K | 来源:发表于2019-05-04 12:43 被阅读0次

    在上篇面试题中可以看到每个对象都有一个isa指针.这个isa指针指向哪里?具体是什么作用呢?这篇面试题:OC对象的isa指针指向哪里?

    OC的对象类型

    首先要知道OC对象有哪些类型.

    1.实例对象(instance对象);指通常我们创建的对象,用[NSObject alloc] init] ,[NSObject new]出来的对象;
    2.类对象(class对象)
    3.元类对象(meta-class对象)

    实例对象

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象

    NSObject *obj1 =  [[NSObject alloc] init];
    NSObject *obj2 =  [[NSObject alloc] init];
    //object1、object2是NSObject的instance对象(实例对象)
    //它们是不同的两个对象,分别占据着两块不同的内存
    

    instance对象在内存中存储的信息包括:

    1.isa指针
    2.其他成员变量

    类对象

    类对象获取方式:

    NSObject *obj1 =  [[NSObject alloc] init];
    NSObject *obj2 =  [[NSObject alloc] init];
    Class obj1Class = [obj1 class];
    Class obj2Class = [obj2 class];
    Class obj3Class = [NSObject class];
    Class obj4Class = object_getClass(obj1);
    Class obj5Class = object_getClass(obj2);
    //obj1Class ~ obj5Class都是NSObject的class对象(类对象)
    //它们是同一个对象。每个类在内存中有且只有一个class对象
    

    class对象在内存中存储的信息主要包括

    1.isa指针
    2.superclass指针
    3.类的属性信息(@property)、类的对象方法信息(instance method)
    4.类的协议信息(protocol)、类的成员变量信息(ivar)
    ......

    元类对象

    元类对象获取方式:

    Class objectMetaClass = object_getClass([NSObject class]);
    //objectMetaClass是NSObject的meta-class对象(元类对象)
    //每个类在内存中有且只有一个meta-class对象
    

    meta-class对象在内存中存储的信息主要包括

    1.isa指针
    2.superclass指针
    3.类的类方法信息(class method)
    ......

    isa指针

    1.instance的isa指向class
    当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
    2.class的isa指向meta-class
    当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
    3.meta-class的isa指向基类的meta-class
    4.基类的meta-class的isa指向自己
    值得注意,这里的指向,其实在64bit后要&上一个mask就可以直接拿到指向的真实地址

    superclass指针

    1.子类的指向父类
    2.父类指向基类
    3.meta-class的superclass指向class
    4.基类的superclass指向nil

    isa指针与superclass指针指向,如下图:


    isa指针与superclass指针指向

    总结

    对象的isa指针转向哪里?

    instance对象的isa指向class对象
    class对象的isa指向meta-class对象
    meta-class对象的isa指向基类的meta-class对象

    相关文章

      网友评论

          本文标题:OC对象的isa指针指向哪里?

          本文链接:https://www.haomeiwen.com/subject/indenqtx.html