美文网首页
iOS底层原理——Objective-C的本质

iOS底层原理——Objective-C的本质

作者: 秃头少女_ | 来源:发表于2021-08-28 15:44 被阅读0次

    一、Objective-C的本质

    1、OC的本质

    OC代码的底层实现其实都是C/C++代码,编译器先把OC代码转换成C/C++代码,接着转成汇编语言,最后转成机器语言最终运行在手机上;所以OC代码的本质其实就是C/C++代码;


    OC对象转换过程

    2、Objective-C的对象、类主要是基于C/C++的什么数据结构实现的?

    Objective-C的面向对象都是基于C/C++的数据结构实现的

    3、手动将Objective-C代码转换成C/C++代码

    • 打开终端,找到要转成C++代码的源文件所在目录,如:main.m
    • 在终端输入命令xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cppxcrun -sdk iphonesimulator clang -arch i386 -rewrite-objc main.m -o main.cpp

    其中:main.m是要编译的文件(带后缀名)main.cpp是要生成的C++文件;

    • mac环境下文件编译命令:clang -rewrite-objc main.m -o main.cpp

    二、OC对象的分类

    1.instance对象(实例对象)
    2.class对象(类对象)
    3.meta-class对象(元类对象)

    1、instance(实例对象)

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象;
    instance对象在内存中存储着信息包括:

    • isa指针
    • 其他成员变量的具体值


      instance在内存中存储信息

      OC对象在内存中是如何布局的:

    • OC对象在内存中其实就是一个结构体,系统会在堆中开辟一块内存空间存放该对象,这块空间里还包含成员变量和isa(struct objc_class)指针,isa的地址就相当于是结构体的地址;然后栈里的局部变量指向这块存储空间的地址;


      OC 对象的内存布局

    2、class(类对象)

    使用class出来的对象(类对象)
    每个类在内存中有且只有一个class对象
    注意:class方法返回的一直是类对象,所以哪怕这样写还是会返回类对象
    Class objectMetaClass2 = [[[NSObject class] class] class];
    class对象在内存中存储的信息

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


      class在内存中存储信息

    3、meta-class(元类对象)

    objectMetaClass是NSObject的meta-class对象(元类对象),每个类在内存中有且只有一个meta-class对象
    Class objectMetaClass = object_getClass(objectClass5);
    meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括

    • isa指针
    • superclass指针
    • 类的类方法信息(class method)
    • ......
      meta-class在内存中存储信息
      isa指针的指向
    • instance的isa指向class
      当调用对象方法时,通过instance对象的isa指针找到class,最后找到对象方法的实现进行调用。
    • class的isa指针指向meta-class
      当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。

    class对象的superclass指针

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

    meta-class对象的superclass指针

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

    isa、superclass的总结

    isa和superclass指向流程
    • instance的isa指向class
    • class的isa指向meta-class
    • meta-class的isa指向基类的meta-class
    • class的superclass指向父类的class;如果没有父类,superclass的指针为nil
    • meta-class的superclass指向父类的meta-class;基类的meta-class的superclass指向基类的class
    • instance调用对象方法的轨迹;isa找到class,方法不存在,就通过superclass找父类
    • class调用类方法的轨迹;isa找meta-class,方法不存在,就通过superclass找父类
      转载自|简书

    相关文章

      网友评论

          本文标题:iOS底层原理——Objective-C的本质

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