美文网首页
app内存分配

app内存分配

作者: JoliLove | 来源:发表于2018-11-06 13:31 被阅读18次

    栈区(stack)

    存储局部变量

    概述:栈是向低地址扩展的数据结构,是一块连续的内存区域。由栈顶的地址和栈的最大容量是系统预先规定好的。栈的空间很小,大概1-2M。超出overflow。

    使用:栈区,就是函数(方法)运行时向系统请求的内存。栈中的局部变量,参数由编译器分配和释放,函数运行就分配,函数结束就释放,由系统完成。是系统数据结构,对应进程唯一。

    特别注意:系统栈的剩余空间 大于 所申请的空间,系统为程序提供内存,不然,报错异常,提示栈的溢出。

    堆区(heap)

    存放实体对象的(alloc 申请的会放入堆中)

    概述:堆是向高地址扩展的数据结构,不连续的内存区域。系统用链表储存空闲地址的。链表遍历由低向高。堆大小直接受设备有效虚拟内存影响。

    1.首先应该知道操作系统有一个记录空闲内存地址的链表。
    2.当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
    3.由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中

    使用: 存放实体对象的。由程序员分配和释放(arc自动插入分配和释放代码),例如alloc 申请的会放入堆中。

    一般由程序员分配释放,若程序员不释放,程序结束时 , 可能由OS回收

    全局\静态区(static)

    存储静态变量和全局变量

    静态变量和全局变量是存储在一起的。初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放
    int a;//未初始化的静态区 int b = 10;//初始化的静态区

    文字常量区

    存放 **常量字符串,程序结束** 系统释放

    程序代码区

    存放函数的二进制代码

    相关经典面试题

    int a = 10;   // 初始化全局区
    NSString *name1; // 未初始化全局区
    NSString *name2 = @"lxx"; // 初始化全局区
    - (void)interviewForStore
    {
       int b;       // 栈区
       NSString *name3 = @"hyc";  // name3栈区   "hyc"在常量区
       NSString *name4;  // 栈区
       char h[] = "plm";  // 栈区
       static int k = 0;   // 全局初始化去
    
       NSString *m = [[NSString alloc] initWithFormat:@"le"];  // 堆区  (alloc分配得来的)
    }
    

    相关文章

      网友评论

          本文标题:app内存分配

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