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代码
  • 如图所示:代码区存放于低地址,栈区存放于高地址,区与区之间并不是连续的

3.注意事项

  • 在ios中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的
  • 系统使用一个链表来维护所有已经分配的内存空间(系统仅仅是记录,并不是管理具体的内容)
  • 变量使用结束后,需要释放内存,OC中是根据引用计数==0 来说明美欧任何变量使用该内存空间,
  • 那么系统救济自动将其回收
  • 当一个app启动后,代码区,常量区,全局区大小都是已经固定的,因此指向这些区的指针不会产生崩
    溃性的错误,而堆区和栈区是时时刻刻变化的(堆得创建和销毁,栈的弹入和弹出),所以当使用一个
    指针指向这个2区里面内存的时候,一定要注意内存是否已经被释放,否则会产生程序崩溃(即野指针报错)

    4.其他操作系统

    • ios是基于unix,android是基于linux在linux和unix系统中,内存管理的方式基本相同的
    • Android应用的内存分配也是如此,除此之外,这些应用层的程序使用过的都是虚拟内存,他们都是建立
      在操作系统之上的 只有开发底层驱动或板级支持包时才会接触到物理内存
      举例:在嵌入式linux中,实际物理地址只有64M甚至更小,但是虚拟内存却可以高达4G

以上是关于iOS开发探究--内存分配和分区的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中的内存分配(堆和栈)

Linux性能学习(2.2):内存_进程线程内存分配机制探究

iOS内存五大分区

iOS 底层探究之 alloc

iOS进程内存分配(页、栈、堆)

“内零头”和“外零头”