- (void)viewDidLoad {
[super viewDidLoad];
// 分配内存操作
Person * p1 = [Person alloc];
// init 操作,
// 并没有对分配的内存空间,做任何的修改 / 处理
Person * p2 = [p1 init];
Person * p3 = [p1 init];
// 对象地址一样,指针指向的地址相同
// 指针自己的地址,不同
// &p1. 取 p1 指针的地址
NSLog(@"p1: %@, --- %p --- %p \n\n", p1, p1, &p1);
NSLog(@"p2: %@, --- %p --- %p \n\n", p2, p2, &p2);
NSLog(@"p3: %@, --- %p --- %p \n\n", p3, p3, &p3);
}
&p1, &p2, &p3
取到的地址,在 16 进制里面,
都只差 8 个字节
一个指针,8 个字节
因为指针本身的地址,都是在栈上,
申请空间
栈的内存空间,是连续的
栈的,内存管理方式
栈的内存空间小,不连续,就浪费
// 地址 0x7 打头,栈
// 地址 0x6 打头,堆
底层探讨的三种途径:
- 1, 符号断点
符号断点的技巧,
符号断点和普通断点,
配合起来打
先让符号断点失效,
触发普通时机的断点后,
再让符号断点生效
alloc
2, 断点操作
step into
然后,再加一个
符号断点
libobjc.A.dylib`objc_alloc: