开发技巧iOS基础·OC高级篇

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.当对象已经释放,但是程序中的变量仍然指向该内存地址,这个时候,如果向该对象发送消息,就会出现经典的野指针错误

上一篇 下一篇

猜你喜欢

热点阅读