iOS开发探究--内存分配和分区
Posted LoSenTrad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发探究--内存分配和分区相关的知识,希望对你有一定的参考价值。
ios内存分配与分区
1.RAM和ROM
- RAM:运行内存,不能掉电储存.
- ROM:储存性内存,可以掉电储存,例如:内存卡,flash
- 由于RAM类型不具备掉电储存能力(即一掉电数据就会丢失),所以app程序一般存放于
ROM中,RAM的访问速度要远高于ROM,价格也要高
2.APP程序启动
app启动,系统会把开启的那个app程序从flash或者ROM里面拷贝到内存中,然后从内存里面
执行代码,另一个原因就是因为CPU不能直接从内存卡里面读取指令(需要Flash驱动等等)
3.内存分区:
- 栈区(stack):
- 存放局部变量,先进后出,一旦出了作用域就会被销毁,函数跳转地址,现场保护等
- 程序猿不需要管理栈区变量的内存
- 栈区的地址从高到低分配
- 堆区(heap):
- 堆区的内存分配使用的是alloc;
- 需要程序猿管理内存
- ARC的内存管理,是编译器在编译的时候自动添加retain,release,autorelease;
- 堆区的地址是从低到高分配
- 全局区/静态区(staic)
- 包括2个部分:未初始化和初始化;
也是说,在内存中是放在一起的,比如:int a;未初始化, int a = 10 初始化的 2者都在
全局区/静态区 - 常量区:常量字符串及时放在这里的
- 代码区:存放app代码
- 包括2个部分:未初始化和初始化;
- 如图所示:代码区存放于低地址,栈区存放于高地址,区与区之间并不是连续的
3.注意事项
- 在ios中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的
- 系统使用一个链表来维护所有已经分配的内存空间(系统仅仅是记录,并不是管理具体的内容)
- 变量使用结束后,需要释放内存,OC中是根据引用计数==0 来说明美欧任何变量使用该内存空间,
- 那么系统救济自动将其回收
当一个app启动后,代码区,常量区,全局区大小都是已经固定的,因此指向这些区的指针不会产生崩
溃性的错误,而堆区和栈区是时时刻刻变化的(堆得创建和销毁,栈的弹入和弹出),所以当使用一个
指针指向这个2区里面内存的时候,一定要注意内存是否已经被释放,否则会产生程序崩溃(即野指针报错)4.其他操作系统
- ios是基于unix,android是基于linux在linux和unix系统中,内存管理的方式基本相同的
- Android应用的内存分配也是如此,除此之外,这些应用层的程序使用过的都是虚拟内存,他们都是建立
在操作系统之上的 只有开发底层驱动或板级支持包时才会接触到物理内存
举例:在嵌入式linux中,实际物理地址只有64M甚至更小,但是虚拟内存却可以高达4G
以上是关于iOS开发探究--内存分配和分区的主要内容,如果未能解决你的问题,请参考以下文章