iOS堆和栈以及内存分布
2016-08-17 本文已影响196人
编程_书恨少
1.iOS中一共分为,代码区,常量区,全局区/静态区(初始化的),全局区/静态区(未始化的), 这几个区是随着程序的启动就被加载到内存中的,也会随着程序的关闭被销毁,我们不需要管理这一部分的内存。注意:这也是为为什么在程序中要尽量减少全局变量/静态变量的使用,因为它会一直存在,占用内存
2.当然除了上面的几部分,还有最重要的两部分,堆区和栈区。堆区的变量内存空间分配一般是在我们写alloc的时候,堆中存放的是对象,我们需要管理的是堆中的内存。虽然现在我们已经习惯了使用ARC,但是ARC也是需要管理内存的,它是在编译器编译的时候,自动添加retain,release,autorelease。
3.栈区存放局部变量,先进后出,当程序执行出了作用于的范围,栈区局部变量就会被销毁,所以我们也不需要管理栈区的内存。
基本的内存分布就是这样了
下面我们来着重的讲一下内存分配
1.在iOS中,堆区的内存是所有应用程序共享的
2.堆区内存分配是由系统来负责的
3.系统通过链表来维护所有已经分配过的内存空间
4.系统只是记录分配了多少字节给应用程序,但是并不管理具体分配给的对象类型
5.变量使用结束后,需要释放内存。在OC中当retainCount == 0时,就说明没有任何变量使用该空间,那么系统就会直接回收
6.如果我们使用某一个变量之后,不释放内存,那么该内存就会被永远占用,造成内存泄漏
7.当对象已经释放,但是程序中的变量仍然指向该内存地址,这个时候,如果向该对象发送消息,就会出现经典的野指针错误