美文网首页
底层2:OC对象分类

底层2:OC对象分类

作者: 张无奈 | 来源:发表于2020-08-28 10:22 被阅读0次

    面试题:对象的isa指针指向哪里?

    instance对象的isa指向class对象;

    class对象的isa指针指向meta-class对象;

    meta-class对象的isa指针指向基类的meta-class对象。

    面试题:OC的类信息存放在哪里?

    对象方法、属性、成员变量、协议信息,存放在class对象中;

    类方法存放在meta-class对象中;

    成员变量的具体值存放在instance对象中。


    分3类:instance对象(实例对象)、class对象(类对象)、meta-class(元类对象)

    instance对象:

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

    NSObject *object1 = [[NSObject alloc]init];

    NSObject *object2 = [[NSObject alloc]init];

    object1、object2是NSObject的instance对象(实例对象)

    它们是不同的两个对象,分别占据着两块不同的内存

    instance对象在内存中存储的类型包含:isa指针、其他成员变量

    class

    meta-class

    1、Class objc_getClass(const char *aClassName)

    1>传入字符串类名

    2>返回对应的类对象

    2.Class object_getClass(id obj)

    1>传入的obj可能是instance对象,class对象,meta_class对象

    2>返回值

    a)如果是instance对象,返回class对象

    b)如果是class对象,返回时meta_class对象

    c)如果是meta_class对象,返回NSObject(基类)的meta_class对象

    3.-(Class)class、+(Class)class

    1>返回的是类对象

    instance的isa指向class

    当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。

    class的isa指针指向meta_class

    当调用类方法时,通过class的isa指针找到meta_class,最后找到类方法的实现进行调用。

    class对象的superclass指针:

    其中Student类继承于Person类,Person类继承于NSObject

    当Student的类对象要调用Person的对象方法时,会先通过isa指针找到Student的class,通过superclass找到Person的class,最后找到对象方法的实现进行调用。

    类对象的类指针指向的是父类的类对象。

    meta-class对象的superclass

    元类的对象superclass指向的是父类的元类。

    总结isa、superclass总结 



    class、meta-class对象的本质结构都是struct objc_class

    struct objc_class的结构体

    注意:

    Class objectClass = [[NSObject class]class];

    获得的objectClass是class对象,并不是meta-class对象。

    查看Class是否为meta-class :

    BOOL result = class_isMetaClass([NSObject class]);

    相关文章

      网友评论

          本文标题:底层2:OC对象分类

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