OC底层系列-对象的底层探索(上)

465 阅读1分钟

--记录学习iOS底层--

1. 对象的本质 (objc_object结构体,里面存储isa指针和成员变量的值。)

  • 我们平时编写的Objective-C代码,底层实现都是C\C++代码

image.png

  • 所以Objective-C的面向对象都是基于C\C++的数据结构实现的 OC的对象、类主要基于C\C++的结构体实现的 将OC代码转换为C\C++代码:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc <OC源文件> -o <输出的cpp文件>
    如果需要链接其他框架,使用-framework 参数。比如-framework UIKit
  • NSObject底层实现 1387472-272e5ed343cb718f.png

2.对象的分类

  • instance (实例对象) v2-958a5a6554a6cac44c373c584b6a3acb_1440w.png

  • class (类对象) v2-4.png

  • meta-class(元类对象) v2-2.jpeg

  • isa指针 通过 isa 指针可以找到类对象,元类对象 v2-5.jpg 位运算找到具体的类对象,元类对象

v2-6.jpg

3.alloc方法的底层调用流程

image.png

4.结构体内存对齐的规则

  • 数据成员对齐规则:结构(struct)的第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储)。 
  • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)。
  • 收尾工作:结构体的总大小,也就是sizeof的结果必须是其内部最大成员的整数倍,不足的要补齐。

总结:通过学习,理解OC对象的本质,和对象的创建过程。

(ps:后续完善)