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