一.堆和栈的概述
栈:编译器自动分配内存,存放参数值以及局部变量的值,类似于数据结构中的栈,使用完成后由系统自动回收内存.
堆:需要程序员手动的开辟和释放内存,存放全局变量和静态变量等.
二.堆和栈存储数据的特点:
栈:先入后出,CocoaTouch框架中对于导航控制器中控制器的维护就是采用了栈的方式,push代表入栈,pop代表出栈.只要栈的剩余空间大于申请的内存空间,系统会为程序提供内存,负责会内存溢出.分配速度快,但是我们无法控制.
堆:先入先出,例如在CocoaTouch框架中Application类就维护的事件队列就是采用了堆的形式.操作系统有一个记录空闲地址的链表,当申请内存地址时,系统首先会遍历保存的链表,寻找第一个空间大于所申请空间的节点.然后将该节点的空间分配给程序,然后将这个节点从空闲链表的节点中删除.分配速度慢,会产生内存碎片但是可定制性高.
PS:动态分配和静态分配的区别
在编译器根据变量(对象)的类型确定内存空间,叫做静态分配.有些变量(对象)在编译期无法确定对象的类型,也就无法确定需要分配给变量(对象)的内存大小,只能在运行时分配,这就是动态分配.