美文网首页
iOS 程序(APP)运行中的内存分配

iOS 程序(APP)运行中的内存分配

作者: 水中的蓝天 | 来源:发表于2020-04-04 14:39 被阅读0次

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

    本文转自:boundlessocean

    在描述内存分配之前,我们需要搞懂两个东西,RAMROM

    一、存储器

    • RAM: 随机存取存储器(random access memory)又称作“随机存储器”,是与 CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序
    • ROM: 只读存储器(Read-Only Memory),是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,并且资料不会因为电源关闭而消失,CPU是不能直接访问的,而是需要文件系统/驱动程序(嵌入式中的EMC)将其读到RAM里面,CPU才可以访问。

    看一下CPURAMROM之间的关系图

    image.png

    二、程序(App)启动运行


    App安装到手机后,存储在 ROM中,程序启动后,系统会把App程序从ROM里面拷贝到RAM,然后从RAM里面执行代码。

    三、RAM内存分布

    RAM内存中分5个区

    • 栈区(stack):

      • 存放的局部变量、函数的参数值、函数跳转地址
      • 先进后出,一旦出了作用域就会被销毁
      • 栈区地址从高到低分配
      • 自动管理内存
    • 堆区(heap):

      • 堆区的内存分配使用的是alloc;
      • ARC的内存的管理,是编译器再便宜的时候自动添加 retain、release、autorelease;
      • 堆区的地址是从低到高分配)
      • 需要程序猿管理内存;
    • 全局区/静态区(static):

      • 存放全局变量和静态变量(未初始化过 、初始化过)
      • 初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量 在相邻的另一块区域
      • 程序结束后由系统释放
    • 常量区:常量字符串就是放在这里;

      • 存放常量字符串
      • 程序结束后由系统释放
    • 代码区:

      • 存放App代码
      • 程序结束后由系统释放


    image.png
    #import "ViewController.h"
    @interface ViewController ()
    @end
    
    NSInteger a = 10;  //全局初始化区
    NSArray *array;    //全局未初始化区
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        
        //UIView *subView 指针存在栈区, [[UIView alloc] init] 对象保存在堆区
        UIView *subView = [[UIView alloc] init];
        NSString *string = @"8888";  // string存在栈上, @"8888" 在常量区。
        static NSInteger count = 0;  // 全局(静态)初始化区, 0 在常量区
    
    }
    @end
    

    四、注意事项:

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

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

    相关文章

      网友评论

          本文标题:iOS 程序(APP)运行中的内存分配

          本文链接:https://www.haomeiwen.com/subject/hjkjphtx.html