# 01.堆栈的深度问题

关于栈深度问题通常会出现在递归中。因为程序在递归时，每一层递归的临时变量和参数，都是被保存在栈中的，所以递归调用的深度过多，就会造成栈空间存储不足。一般来说栈是向下生长的，堆是向上生长的。把内存地址像门牌号编号成 1 \~ 10000，栈的使用就是先用第 10000 号内存块，再用第 9999 号内存块，依次减小编号。而堆的话，是先用第 1 号内存块，再用第 2 号内存块，依次增加编号。 堆内存可以认为是没有上限的（除非你的硬盘空间不足），如果消耗光了计算机的内存，操作系统还会用硬盘的虚拟内存为你提供更多的内存，虚拟内存和内存的读写速度几倍一致。但是如果大量程序占用了虚拟内存，很可能会出现内存泄露问题。这种情况，虚拟内存很快就会被消耗完毕。 栈内存不同于堆内存，通常编译器都会指定程序的栈内存空间使用的大小，如果栈内存使用超出了限制，就会触发程序异常退出，即栈溢出错误（Stack Over flow）。但是iOS实际开发中很少出现栈溢出问题，这就从侧面反映出使用的递归比较少。苹果官方文档指明：对于主线程，栈内存为 1 MB；非主线程，栈内存为 512 KB。如果想测试这一点，在主线程创建一个大小为100万的数组，这是Xcode就会报错。
