-
内存介绍
一般而言,手机内存我们分为两大块 RAM 和 ROM
RAM:就是我们说的运行内存,对于大学时期买安卓机尤其是三星的,RAM对于价格有时是个硬伤,因为那时大部分还是1g的,如果2g的可能就贵很多,它不能掉电储存
ROM:储存性储存(比如储存卡,flash),可以掉电储存,比如买手机,比如7p 128G说的就是这个,手机的应用程序,照片,文件,等等全部储存在这里
当你启动手机app的时候,系统会把开启的那个App程序从Flash或ROM里面拷贝到内存(RAM),然后从内存里面执行代码。
另一个原因是CPU不能直接从内存卡里面读取指令(需要Flash驱动等等
-
内存几大块(内存分布)
-
栈区
-
1.存放的是局部变量,函数的参数,函数的跳转地
-
2.先进后出
-
3.一旦出了作用域就会被销毁
-
4.由编译器自动分配并释放,栈区地址从高到低分配
-
5.栈有两种分配方式:静态分配和动态分配,静态分配是系统编译器完成的,比如局部变量的分配,动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理
-
堆区
-
1.堆区的内存分配使用的是alloc,需要程序猿管理内存;
-
2.ARC的内存的管理,是编译器再编译的时候自动添加 retain、release、autorelease;
-
3.堆区的地址是从低到高分配)
-
4.虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素
栈和堆的对比
首先我们了解下iOS中的内存管理范围
1.在iOS中只有oc对象才需要内存管理
2.非oc对象比如基本数据类型是不需要内存管理的
再说下内存管理的本质
因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)
堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存
如果在非oc对象,比如c语言中alloc了,那么也要自己free
栈:由系统自动分配,速度较快,不会产生内存碎片
堆:是由alloc分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便
借用别人的比喻:打个比喻来说:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大
-
全局区和静态区(static)
-
1.全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后有系统释放
未初始化的
全局变量: int a
静态变量 :static int b;
//未初始化的存放一块
全局变量: int c=2;
静态变量 :static int d=5;
//初始化的放一块
-
代码区
-
1.存放App代码的二进制
-
常量区
-
1.存放常量字符串,程序结束后由系统释放