iOS内存分配(栈堆)

  • 内存介绍

一般而言,手机内存我们分为两大块 RAM 和 ROM
RAM:就是我们说的运行内存,对于大学时期买安卓机尤其是三星的,RAM对于价格有时是个硬伤,因为那时大部分还是1g的,如果2g的可能就贵很多,它不能掉电储存
ROM:储存性储存(比如储存卡,flash),可以掉电储存,比如买手机,比如7p 128G说的就是这个,手机的应用程序,照片,文件,等等全部储存在这里
当你启动手机app的时候,系统会把开启的那个App程序从Flash或ROM里面拷贝到内存(RAM),然后从内存里面执行代码。
另一个原因是CPU不能直接从内存卡里面读取指令(需要Flash驱动等等

  • 内存几大块(内存分布)

  • 栈区
  • 1.存放的是局部变量,函数的参数,函数的跳转地
  • 2.先进后出
  • 3.一旦出了作用域就会被销毁
  • 4.由编译器自动分配并释放,栈区地址从高到低分配
  • 5.栈有两种分配方式:静态分配和动态分配,静态分配是系统编译器完成的,比如局部变量的分配,动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理
  • 堆区
  • 1.堆区的内存分配使用的是alloc,需要程序猿管理内存;
  • 2.ARC的内存的管理,是编译器再编译的时候自动添加 retain、release、autorelease;
  • 3.堆区的地址是从低到高分配)
  • 4.虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素

栈和堆的对比
首先我们了解下iOS中的内存管理范围
1.在iOS中只有oc对象才需要内存管理
2.非oc对象比如基本数据类型是不需要内存管理的

再说下内存管理的本质
因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)
堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存
如果在非oc对象,比如c语言中alloc了,那么也要自己free

栈:由系统自动分配,速度较快,不会产生内存碎片
堆:是由alloc分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便

借用别人的比喻:打个比喻来说:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大

  • 全局区和静态区(static)
  • 1.全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后有系统释放
未初始化的
全局变量: int a
静态变量 :static int  b;
//未初始化的存放一块

全局变量: int c=2;
静态变量 :static int  d=5;
//初始化的放一块
  • 代码区
  • 1.存放App代码的二进制
  • 常量区
  • 1.存放常量字符串,程序结束后由系统释放

推荐阅读更多精彩内容