iOS app运行中的内存分配

在描述内存分配之前,我们需要先搞懂两个东西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代码
    • 程序结束后系统释放
image.png
#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.注意事项

  1. 栈区的变量由编译器负责分配和释放,内存随着函数的运行分配 ,随着函数的结束而释放,有系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常,提示栈溢出

2、 当app启动时,代码区,常量区,全局区大小早已固定,而堆区和栈区是时刻变化的(堆区的创建和销毁,栈的弹入弹出),当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则将产生程序崩溃

你可能感兴趣的:(iOS app运行中的内存分配)