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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值