iOS app运行中的内存分配
2021-04-12 本文已影响0人
YSH_110
在描述内存分配之前,我们需要先搞懂两个东西RAM,ROM
1.存储器
-
RAM:随机存取存储器,又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。存储单元的内容可按需随意取出和存入,且存取的速度和存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储时间短的程序
-
ROM:只读存储器(read-only memory),是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦存储资料就无法再将之改变或删除。通常用在不需要经常变更资料的垫子或电脑系统中,并且资料不会因为电源关闭而消失,cpu也不能直接对其进行访问,而是需要文件系统/驱动程序 将其督导ram中,cpu才可访问
CPU - RAM - ROM之间的关系图
image.png
2.程序启动运行
App安装到手机号,存储在rom中,系统会把app程序从rom拷贝到ram,然后从ram中执行代码
3.RAM内存分布
RAM内存中5个分区
-
栈区(stack):
- 存放局部变量,函数的参数值,函数跳转地址
- 先进后出的原则,一旦出了作用域就销毁
- 栈区地址从高到低分配
- 自动管理内存
-
堆区(heap):
- 堆区的内存分配是用的是alloc
- ARC的内存的管理,是编译器在便宜的时候自动添加retain,release,autorelease;
- 堆区的地址是从低到高分配
- 需要程序员管理内存
-
全局区/静态区(static):
-
存放局部变量和静态变量(未初始化过,初始化过)
-
初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量在相邻的另一区域
-
程序结束后系统释放
-
常量区:
- 存放常量字符串
- 程序结束后由系统释放
-
代码区:
- 存放app代码
- 程序结束后系统释放
#import "VC"
@interface VC()
@end
nsinteger a = 10 //全局初始化区
NSArray *array; //全局未初始化区
@implementation VC
-(void)viewDidLoad
{
//uiview *subV 指针存在栈区 【uiview alloc【init】对象保存在堆区
UIView *SubV =[ [uiview alloc]init];
nsstring *string = @"8888"; //string存在栈区,8888存在常量区
static nsinteger count= 0;//count全局静态初始化区 0在常量区
}
@end
4.注意事项
- 栈区的变量由编译器负责分配和释放,内存随着函数的运行分配 ,随着函数的结束而释放,有系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常,提示栈溢出
2、 当app启动时,代码区,常量区,全局区大小早已固定,而堆区和栈区是时刻变化的(堆区的创建和销毁,栈的弹入弹出),当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则将产生程序崩溃