一、探究内存
XYPersion *p1 = [XYPersion alloc];//alloc有了内存
XYPersion *p2 = [p1 init];//init函数扩展,没有对指针进行操作
XYPersion *p3 = [p1 init];//指针地址,存储在栈
p1 = p2 = p3,但三个指针地址的地址是连续的
知:0x7 栈内存地址。0x6堆内存地址
二、断点方式
control+step into 进入断点,进入底层源码
// 1: 符号断点 确定的情况填写符号:libobjc.A.dylib`objc_alloc:
// 2: 汇编 Debugs->alwalys show desassambly control+step into跟流程
callq:调用
// 3: 符号断点 在不确定的情况 : libobjc.A.dylib`+[NSObject alloc]:
三、alloc底层
四、对象空间
创建无属性对象内存大小:
(16 + 0 - 8)+ sizeof(15)& ~sizeof(15)
8+15 &~15
23 & ~15
00010111 & ~00001111
00010111 & 11110000
00010000
=16
五、知
// ⚠️编译调试不能过: 请你检查以下几小点⚠️
// ①: enable hardened runtime -> NO
// ②: build phase -> denpendenice -> objc
bt 堆栈命令 lldb指令; dyld 链接整个函数库,libsystem libdispatch(gcd) libobjc(runtime 底层源码)
dyld_start -> main -> libsystem_init -> libdispatch -> gcd环境 -> _objc_init
po this (this = self)
init init return (id)self:构造方法 工厂设计 提供入口,便于扩展
new = calloc(alloc)+init / new return [callAlloc(self, false/checkNil/) init];(alloc init) init 无法扩展 ,不能重写
objc_opt_new = new
空间换取时间
六、学:
源码:opensources.apple.com、sourcesBrowser
OBJC2
register read 读取寄存器
po 0x14 w 代表32位
optimization level 优化: slowpath
p :expression print ; po:输出对象
if(size<16)size=16
XYPersion = isa. = 8
x p 打印16进制地址。小端模式
view memory 查看小端地址