美文网首页
iOS内存分配(栈堆)

iOS内存分配(栈堆)

作者: edison0428 | 来源:发表于2017-08-23 11:34 被阅读190次
  • 内存介绍

一般而言,手机内存我们分为两大块 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.存放常量字符串,程序结束后由系统释放

相关文章

  • iOS内存分配(栈堆)

    内存介绍 一般而言,手机内存我们分为两大块 RAM 和 ROMRAM:就是我们说的运行内存,对于大学时期买安卓机尤...

  • iOS中:栈和堆概念

    iOS中栈和堆 栈: 系统自动分配内存堆: 程序员手动分配内存 1、代码区:用来存放函数的二进制代码,在运行时要防...

  • iOS中的堆和栈

    内存分配图: 参考: iOS中堆和栈的理解 What and where are the stack and he...

  • Swift 中的内存分配情况与优化思路

    Allocation 内存分配 内存分配可以分为堆区栈区,在栈的内存分配速度要高于堆,结构体和类在堆栈分配是不同的...

  • iOS知识梳理12:堆和栈

    相关连接iOS程序中的内存分配 栈区堆区全局区 内存分区 1.栈区(stack) 由编译器自动分配并释放,存放函数...

  • JS 堆栈

    堆是堆内存的简称,栈是栈内存的简称。 堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内...

  • 关于JS的堆和栈的理解

    一、堆(heap)和栈(stack) 栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存...

  • iOS内存分配:堆、栈、全局区、常量区、代码区

    前言 内容参考: iOS 内存分配 栈、堆、全局区、常量区、代码区 NSString存储管理--NSTaggedP...

  • 内存5大区

    iOS程序中的内存分配分为5大区 内存5大区:堆,栈,方法区,全局区,常量区 栈:不需要手动管理内存,会自动清理栈...

  • iOS 栈和堆总结

    转载自 :大神博客iOS程序中的内存分配iOS 堆和栈的区别block与propertyiOS中__block 关...

网友评论

      本文标题:iOS内存分配(栈堆)

      本文链接:https://www.haomeiwen.com/subject/tekddxtx.html