app内存分配

栈区(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分配得来的)
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,419评论 1 22
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,731评论 0 11
  • 在一本书上看到,鲁豫说:(大概意思是)鱼在海里要好多水才能存活,但鱼身体面积所接触的水只有一点点,学的很多不知何时...
    风飞云会阅读 368评论 0 0
  • 喜欢是什么?在你的内心里,你是否道答案。你是否也曾迷茫过,因为不懂喜欢是什么,便觉得自己丧失爱的能力。 其实我也不...
    若希记阅读 1,112评论 2 4
  • 纪实生活 体悟人生 今天是2016年6月1日 天气晴天 温度29度左右 今天早上六点多就起床了 起来以后就先找水喝...
    木风恒阅读 177评论 0 0