目录
概述
文章概述
之前写过一篇文章,曾经对OC中的内存管理进行过总结。OC内存管理
这篇文章希望以计算机内存为线索,将C及OC的部分知识点进行串联式复习总结
嗯哪,我们开始吧~
内存概述
计算机内存分为五大区域:
1. 栈区(存放局部变量,由编译器自动释放–如代码块结束、程序结束等)
2. 堆区(存放对象,有程序员手动释放)
3. 全局区/静态区(存放全局变量和静态变量,初始化的全局、静态变量存放在一块内存中,未初始化的存放在另一块内存中)
4. 文字常量区(存放常量,程序结束后自动释放)
5. 程序代码区(存放二进制代码,程序结束自动释放)
内存
栈区与堆区的对比
- 栈区存放的是非对象类数据,如:指针、结构体、c数组、int;堆区存放的是对象类数据,需要申请内存分配的
- 栈区内存较小(M为单位),与堆区内存(G为单位)远不在一个数量级上
- 栈区又编译器管理,堆区由程序员手动管理(容易出现内存溢出)
- 读取速度栈比堆快
- 堆的生长方向向上,向着内存地址增加的方向;栈的生长方向向下,向着内存地址减小的方向
- 碎片问题:栈是先进后出,不会产生碎片;堆是先进先出,会产生碎片
一句代码可能既使用了栈区,也使用了堆区
NSArray *array = [NSArray arrayWithObject:@”哒哒哒”]
指针array存放在栈区,字符串对象和数组对象存放在堆区
全局区/静态区与static关键字
static关键字修饰的变量,均置于全局区中。若被static修饰的变量定义在函数体内,则该变量仅能在该函数体内使用;若在函数体外,则表示该变量仅在该文件中能使用。
栈区内存存放方式
栈区内存从未被使用的大内存地址开始,向小内存地址方向寻址,并从小内存地址开始依次排布数据(如:c数组)。以变量区域中最小的内存地址,作为整个变量的内存地址(被指针所指向)
关于SEL和程序代码区…
暂未弄明白他们之间的关系,嘿嘿~ 等徐某学了汇编之后,再来解答这个问题咯