iOS内存管理小谈
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS内存管理小谈相关的知识,希望对你有一定的参考价值。
内存管理管理的是哪的内存?其实我们要管理的就是堆区的内存空间和任何继承NSObject的对象
1.首先要明确的一点是内存总共分为五大区,分别是栈区,堆区,BSS段,数据区和代码区;
2.BSS段,数据区和代码区这三大区是随着程序的启动加载到内存空间的,我们熟知的全局变量就存储在这里,不过分为两种情况:如果是未初始化的全局变量,那么它存储在BSS段,如果是初始化的全局变量的话就存储在数据区;很多时候我们不推荐大家创建全局变量的原因就是因为如果一个程序启动的话,存储在这里的全局变量就会随着程序的启动进行加载,分配内存空间;这就会导致程序加载的特别缓慢。不过有一点要明确的是这三大区是系统自动管理的,所以我们的内存管理不是管理这三大区
3.接下来就剩下了栈区和堆区,首先我们要知道的是在内存分配中栈区的地址是从高到低分配,堆区的地址是从低到高分配;而且我们所熟知的基本数据类型存储在栈区中,它所占用的存储空间是一定的
4.其次,在栈区中同时存放的还有局部变量,而局部变量的空间不需要我们进行回收,而是它所在的代码块或者函数在结束的时候会自动回收,所以栈区的内存空间不需要程序员管理
5.最后只剩下堆区,所以我们可以基本确定我们要学习的内存管理就是对堆区内存空间的管理,不过我们还要先分析堆区再做决定
6.在OC中我们创建对象时用的语句是new,而new的三个步骤依次为:1.在堆区中分配一块内存空间 2.给创建好的对象进行初始化 3.返回地址;我们看到了它是在堆区中分配!所以我们要做的就是管理堆区的空间,考虑堆区内存什么时候申请,什么时候回收;同时因为我们创建对象的原因,内存管理实际上也要管理任何继承自NSObject的对象,而对其他基本数据类型无效。所以到这里我们应该知道我们在OC中要讨论的内存管理实际上就是研究堆区的内存空间以及任何继承NSObject的对象!
7.分析到这里时我们一定恍然大悟,其实我们对上面的每个小段落的知识都是了解的,只是我们从来没有条理性地将它们串联到一起;我们在明确内存管理到底要管理什么东西之后,我们在讨论一下内存泄露的本质原因
8.内存泄露的本质原因就是对象存储在堆区,局部变量和指针等存储在栈区,在一个程序执行完毕进行销毁的时候,代码块中所涉及的所有局部变量都会被系统回收,而且指向对象的指针也会被系统回收,那么在这个时候,存在于堆区的对象没有指针的指向但是却依然存在于内存中,就会造成内存泄露
以上是关于iOS内存管理小谈的主要内容,如果未能解决你的问题,请参考以下文章