所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。
image.png
内存分类(RAM、ROM)
- RAM:
运行内存
,不能掉电储存; - ROM:
储存性内存
,可以掉电储存,例如:内存卡,flash; - RAM的访问速度要远高于ROM,价格也要高;
- CPU只能从RAM直接读取指令;
app程序一般存放于ROM中。启动app时,系统会把开启的app程序从ROM中转移到RAM中。
内存分区
iOS中主要是栈区(stack)、堆区(heap)、全局区/静态区(staic) ;
栈区
存放局部变量,先进后出
,一旦出了作用域就会被销毁,函数跳转地址,现场保护等
栈区的地址从高到低
分配
堆区
堆区的内存分配使用的是alloc;
堆区的地址是从低到高
分配;
ARC原理是基于堆区
,编译器在编译的时候给对象自动添加retain,release,autorelease;
在ios中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;
全局区
- 未初始化
在内存中是放在一起的,比如:int a; - 初始化
未初始化, int a = 10
以上 2者都在全局区/静态区;
常量区
常量字符串及时放在这里的;
代码区
存放app代码;
tips:
堆区需要程序猿管理内存,是由alloc分配的内存,一般速度比较慢,容易产生内存碎片;
栈区不需要程序猿管理内存,由编译器自动分配并释放,速度快;
当一个app启动后,代码区,常量区,全局区大小都是已经固定的,因此指向这些区的指针不会产生崩溃性的错误,而堆区和栈区是时时刻刻变化的(堆得创建和销毁,栈的弹入和弹出),所以当使用一个指针指向这个2区里面内存的时候,一定要注意内存是否已经被释放,否则会产生程序崩溃(即野指针报错)
网友评论