==程序在内存空间分布为:==
由低向高 各个地址块 不连续
高地址
-
栈区(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的引用计数内存管理方法
网友评论