美文网首页
IOS基础知识-OC对象原理篇

IOS基础知识-OC对象原理篇

作者: 程序员的自我救赎 | 来源:发表于2019-06-26 10:58 被阅读0次

    一个NSObject对象占用多少内存?

    NSObject对象转化为c语言,实际上就是一个结构体;里面只有一个成员isa指针,而指针在64位架构中占8个字节。也就是说一个NSObjec对象所占用的内存是8个字节(32位4个字节)。
    

    内存对齐为两个原则:
    原则 1. 前面的地址必须是后面的地址正数倍,不是就补齐。
    原则 2. 整个Struct的地址必须是最大字节的整数倍。

    OC的类信息存放在哪里

    OC对象主要可以分为三种
    instance对象(实例对象)
    class对象(类对象)
    meta-class对象(元类对象)
    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
    
    class对象在内存中存储的信息主要包括
    isa指针
    superclass指针
    类的属性信息(@property),类的成员变量信息(ivar)
    类的对象方法信息(instance method),类的协议信息(protocol)
    
    meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
    
    isa指针
    superclass指针
    类的类方法的信息(class method)
    

    对象的isa指针指向哪里

    当对象调用实例方法的时候,我们上面讲到,实例方法信息是存储在class类对象中的,那么要想找到实例方法,就必须找到class类对象,那么此时isa的作用就来了。

    [stu studentMethod];
    

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

    当类对象调用类方法的时候,同上,类方法是存储在meta-class元类对象中的。那么要找到类方法,就需要找到meta-class元类对象,而class类对象的isa指针就指向元类对象

    [Student studentClassMethod];
    

    class的isa指向meta-class
    当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用


    1434508-e71cf3850379fe21.png

    当对象调用其父类对象方法的时候,又是怎么找到父类对象方法的呢?,此时就需要使用到class类对象superclass指针。

    [stu personMethod];
    [stu init];
    

    当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用,同样如果Person发现自己没有响应的对象方法,又会通过Person的superclass指针找到NSObject的class对象,去寻找响应的方法


    1434508-c424291af118ebad.png

    当类对象调用父类的类方法时,就需要先通过isa指针找到meta-class,然后通过superclass去寻找响应的方法

    [Student personClassMethod];
    [Student load];
    

    当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用

    对isa、superclass总结

    instance的isa指向class
    class的isa指向meta-class
    meta-class的isa指向基类的meta-class,基类的isa指向自己
    class的superclass指向父类的class,如果没有父类,superclass指针为nil
    meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
    instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找父类
    class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类


    1434508-49ba7d6446b3ded2.png

    总结:

    一个NSObject对象占用多少内存?
    答:一个指针变量所占用的大小(64bit占8个字节,32bit占4个字节)
    对象的isa指针指向哪里?
    答:instance对象的isa指针指向class对象,class对象的isa指针指向meta-class对象,meta-class对象的isa指针指向基类的meta-class对象,基类自己的isa指针也指向自己。
    OC的类信息存放在哪里?
    答:成员变量的具体值存放在instance对象。对象方法,协议,属性,成员变量信息存放在class对象。类方法信息存放在meta-class对象。
    

    相关文章

      网友评论

          本文标题:IOS基础知识-OC对象原理篇

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