堆就是内存中的一大块存储空间,我们可以根据程序需要向操作系统申请所需大小的空间来使用,使用完要释放掉,也就是说告诉操作系统,喂,哥们,我用完了,还你。操作系统也是通过某种方式来表示哪块空间已经在使用,哪些空间没有使用。你不告诉他你用完了,他怎么知道你什么时候还需要呢。明明白白你的心,他不懂啊。所以忘记释放就会导致“内存泄漏”。说白了就是你用完了,没还。然后你也找不到这块内存在哪了,而操作系统那边还登记着有人在使用。所以这块内存就浪费掉了。除非你的程序退出,操作系统才会回收你程序运行所使用过的内存空间。如果你是用循环申请空间的话,就可能会不断的申请内存而不释放,最终导致内存消耗殆尽,影响系统运行效率。尤其是手机开发,我们知道手机的内存空间都不是很大。这也是很多老师和教材强调申请堆空间后记得一定要释放的原因。OC中所有的对象都是在堆空间中申请的。所以只要是对象,那么对象中的成员数据就是存放在堆中的。 而栈结构是实现函数调用的一种数据结构由编译器或操作系统自动分配的存储空间,不需要我们人为的去干涉。调用一个函数时,参数,局部变量都是存放在栈空间的,栈空间的范围在CPU寄存器ebp到esp之间(32位);当退出当前函数后ebp和esp就会恢复到上个函数的空间范围。所以返回函数内部局部变量的指针是一个很危险的行为,因为所批向的内存空间已经“无主”,其中的数据是“不可控"的(高手除外)。
而有些数据是我们想即使退出了某个函数后仍然可以使用,那么在堆中申请空间是最适合不过的了。这样更加灵活。而栈则不具有这样的弹性, 如果用返回值的形式保存数据,数据很大的话 返回时会产生数据的复制过程。严重影响效率。so......这也是为什么类都是在堆中申请的原因喽! |