iOS-底层探索-alloc

115 阅读1分钟

作为一名iOS开发者 记录下平时技术栈的总结 知其然知其所以然 梦的开始 首先从alloc开始

alloc的底层探索

- alloc的调用函数流程
+ (id)alloc -> _objc_rootAlloc -> callAlloc -> _objc_rootAllocWithZone -> _class_createInstanceFromZone
!!!这步骤llvm会优化
alloc的流程
  1. alloc时 llvm 会将alloc -> objc_alloc - 记录该receiver
  2. objc_alloc - > objc_msgSend(alloc) 又会走回来
  3. 此时receiver 已被标记 所以走[NSObject alloc]
影响类的内存大小
  • 影响因素
  1. 属性
  2. 成员变量
  • 不影响因素
  1. 方法
内存对齐的原则

1.数据成员对齐规则:结构体(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者子成员大小(只要该成员有子成员,比如说数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储.) 1.结构体作为成员:如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素的整数倍地址开始存储.(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储)

  • 对象的内存 16字节对齐 (对象对象之间)
  • 成员变量的 8字节对齐 (结构内部)
init
  • alloc已经将内存开辟 并且将isa 和 class 绑定 那么init有什么用呢 接下来看源码

image.png

image.png

  • 看了源码 init操作就是返回一个本身的是对象 没有什么其他操作 也就是说是为了我们方便拓展的这么一个函数