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

一、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的本质)