iOS开发 OC对象原理--alloc流程学习笔记

285 阅读1分钟

知识点

  1. alloc初始化了内存和指针,init貌似啥都没做。
  2. 对象的内存地址在堆里面,而指向堆的指针的内存地址在栈里面。
  3. 想要分析源码需要找到对应的方法:
  • 符号断点 libobjc.A.dylib`objc_alloc
  • 打开汇编 跟流程 - 符号断点:objc_alloc
  • 直接搜索对应方法的符号断点 确定未知:libobjc.A.dylib` +[NSObject alloc]
  1. Build Settings - Optimization Level - 设置编译器优化代码的力度,通常release版本要Fastest, Smallest
  2. 对象的内存大小依赖于成员变量的大小:
  • alloc出来的对象最少16字节,因为NSObject中有一个成员变量:Class isa,结构体指针类型,8字节,多出来的8字节用来容错
  • 成员变量统一各分配8字节,因为通常成员变量的大小都不会超过8字节
  • 字节对齐 (x + WORD_MASK) & ~WORD_MASK
  1. 万物皆对象,最底层是objc_object,objc_class既是结构体指针,也是对象。

LLDB命令

  1. x p:输出p的所有成员变量地址,第一个是isa
  2. x/4gx p:格式化顺序输出p的4个成员变量地址
  3. e -f f -- 内存地址:输出double类型

alloc流程图

alloc流程.png