2. 内存分配

==程序在内存空间分布为:==

由低向高 各个地址块 不连续

高地址
  • 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。
  • 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
  • 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。
  • 文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放。
  • 程序代码区:存放函数体的二进制代码。
低地址

==内存管理方案==分三部分

TaggedPointer  //存放NSNumber等小对象
NONPOINTER_ISA        //arm64位架构下内存管理方案
散列表SideTables  //是由一个个sideTable结构组成,是一个哈希表,sideTable包含弱引用表和引用计数表和自旋锁
NONPOINTER_ISA

arm64架构下才用

散列表方式 SideTables()结构

SideTables()实际上是个哈希表,可通过一个对象指针,来找到它的引用计数表或者弱引用表具体在哪个sideTable中。

[图片上传失败...(image-8c89dd-1599486679760)]

==栈和堆==

栈是一个用来存储局部和临时变量的存储空间

NSObject *obj = [[NSObject alloc] init];

系统会在栈上存储obj这个指针变量,它所指的对象在堆中。通过[NSObject alloc]系统会为其在堆中开辟一块内存空间。
栈对象的生命周期不适于Objective-C的引用计数内存管理方法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容