对象底层原理(上)
一. 初探 alloc
LGPerson *p2 = [p1 init];
LGPerson *p3 = [p1 init];
LGNSLog(@"%@ - %p - %p",p1,p1,&p1);
LGNSLog(@"%@ - %p - %p",p2,p2,&p2);
LGNSLog(@"%@ - %p - %p",p3,p3,&p3);
<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651098
<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651090
<LGPerson: 0x600002a14490> - 0x600002a14490 - 0x7ffee8651088
- alloc
- 在堆内存中开辟内存空间.
- "%@"和"%p"占位的区别
- "%@"打印类型,和description 方法打印对象地址.(堆中的对象地址堆)
- "%p"打印对象的地址.(堆中的对象地址)
- "%&p"打印指针的地址.(栈中的指针地址)
- 栈内存(指针对象地址)是连续的相差 8 字节
- 栈对象为什么是 8 字节, 一个对象是一个结构体, 一个结构体是一个指针就是 8 字节.
- 连续往下开辟
alloc 是怎么开辟内存的
- 符号断点
-
加 alloc 符号断点
- "alloc" + setep over单步调试,会找到
libobjc.A.dylib +[NSObject alloc]: - setep into单步调试进入子函数,会找到
jump _objc_rootAlloc
- "alloc" + setep over单步调试,会找到
-
加符号断点 objc_alloc(无效)
- 没有符号断点, 需要 ctr + step into,会找到'objc_alloc'
- 函数调用栈加'objc_alloc'观察能发现源码路径'libobj.A.dylib.'
-
查看汇编
-
对象的内存空间和分布都是由属性影响.
-
内存对齐.