iOS 底层原理之 alloc 探究

前言

作为一名iOS小码农,每天接触最多的就是对象的创建,alloc ,init; 但是alloc和init到底干了些什么?今天咱们来一起研究下,废话不多说,直接上代码

HHPerson *p1 = [HHPerson alloc];

HHPerson *p2 = [p1 init];   

HHPerson *p3 = [p1 init];       

HHPerson *obj1 = [HHPerson alloc];   

HHPerson *obj2 = [HHPerson alloc];   

NSLog(@"%@ - %p - %p",p1,p1,&p1);   

NSLog(@"%@ - %p - %p",p2,p2,&p2);   

NSLog(@"%@ - %p - %p",p3,p3,&p3);   

NSLog(@"%@ - %p - %p",obj1,obj1,&obj1);   

NSLog(@"%@ - %p - %p",obj2,obj2,&obj2);

打印结果为

通过p1,p2,p3打印的内容,对象的地址是一样的,但是指针的地址是不一样的;得出alloc开辟内存空间,init貌似什么都没做;

继续分析,p,obj1,obj2 对象的地址,指针的地址都不一样,对象的地址是递增,指针的地址是递减;


总结

    alloc 开辟了一块空间,init没有开辟空间

    栈区开辟的内存是高地址到低地址,堆区则是低地址到高地址。

这里简单说一下堆栈的内容

栈:是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,LIFO)


注意:以前的栈:是往里放一个数据,sp往上挪一格,出去一个往下挪一格,也就是push,pop。 但是现在的ARM64是先开辟一块空间(可能是空的),sp直接指向栈顶,然后往里面放的东西,sp跟随者往下挪。iOS中栈的开口方向是往低地址,编译器通过编译来决定开辟栈空间的大小。局部变量,参数等放在栈空间中。


回归正题,接下来我们打断点来跟一下流程

按住control 键点击框中键,进入

可以看到走的是objc_alloc 这个函数,但是看不到底层实现代码,我们现在介绍第一种方法,下符号断点

继续往下走

于是我们得到了objc_alloc所在的库是libobjc.A.dylib

第二种方法,查看汇编代码,分析调用链


步骤,Debug ----> Debug Workflow -------> Always Show Disassembly 通过汇编看流程,(取消也是同样的步骤)


这时候就能看到汇编代码实现院里,能看到流程中走了哪些函数,这时候再下符号断点就能继续下去。

第三种方法:我不管它调用什么函数,我直接给下alloc符号断点跟流程。

接下来我们跟下源码流程

源码

苹果开源源码汇总

这个地址用的更直接

通过跑源码跟流程总结alloc流程为

你可能感兴趣的:(iOS 底层原理之 alloc 探究)