美文网首页
iOS的内存分配

iOS的内存分配

作者: 雪山飞狐_91ae | 来源:发表于2018-03-18 18:43 被阅读154次

iOS中的内存大致可以分为代码区,全局/静态区,常量区,堆区,栈区。

  • 1.代码区
    代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。
  • 2.全局/静态区
    全局/静态区存放的是静态变量,静态全局变量,以及全局变量。初始化的全局变量,静态变量,静态全局变量存放在同一区域,未初始化的变量存放在相邻的区域。程序结束后由系统释放。
  • 3.常量区
    常量区存放的就是字符串常量,int常量等这些常量。
  • 4.栈区
    这块区域是由编译器自动分配并释放的,栈区存放的是函数的参数及自动变量。栈是向低地址扩展的一块连续的内存区域。分配在栈上的变量,当函数的作用域结束,系统就会自动销毁变量。
  • 5.堆区
    堆区内存一般是由程序员自己分配并释放的。当我们使用alloc来分配内存时分配的内存就是在堆上。由于我们现在大部分都是使用ARC,所以现在堆区的分配和释放也基本不需要我们来管理。堆区是向高地址扩展的一块非连续区域。
    下面通过代码来看一下内存的分配
int a = 1;//全局比那辆分配在全局/静态区

static int b = 2;//静态全局变量分配在全局/静态区


- (void)viewDidLoad {
    [super viewDidLoad];
  
    static int c = 3;//静态局部变量分配在全局/静态区
    
    int d = 4;//自动变量分配在栈区
    NSString *string = @"abcd";//string自动变量分配在栈区,后面的字符串常亮分配在常量区
    NSArray *array = [[NSArray alloc] init];//array自动变量分配在栈区,后面创建的oc对象分配在堆区,栈区的指针指向堆区的对象。
    
    
}

栈区和堆区的比较

  • 1.分配方式不同
    栈区是由编译器自动分配和释放,但是堆区是由程序员来分配和释放。
    1. 申请后系统的响应
      栈区:栈区内存由编译器分配和释放,在函数执行时分配,在函数结束时收回。只要栈区剩余内存大于所申请的内存,那么系统将为程序提供内存。
      堆区:系统有一个存放空闲内存地址的链表,当程序员申请堆内存的时候,系统会遍历这个链表,找到第一个内存大于所申请内存的堆节点,并把这个堆节点从链表中移除。由于这块内存的大小很多时候不是刚刚好所申请的一样大,所以剩余的那一部分还会回到这个空闲链表中。
  • 3.申请大小的限制
    栈区:栈区是向低地址扩展的数据结构,也就是说栈顶的地址和栈的容量大小是由系统决定的。栈的容量大小一般是2M,当申请的栈内存大于2M时就会出现栈溢出。因此栈可分配的空间比较小。
    堆区:堆是向高地址扩展的数据结构,是不连续的。堆的大小受限于计算机系统中有效的虚拟空间,因此堆可分配的空间比较大。
    1. 申请效率的比较
      栈:栈由系统自动分配,速度较快,但是不受程序员控制。
      堆:堆是由alloc分配的内存,速度较慢,并且容易产生内存碎片。

相关文章

  • 探索iOS内存分配

    探索iOS内存分配 探索iOS内存分配

  • iOS 性能优化 - Allocations分析内存分配

    iOS 性能优化 - Allocations分析内存分配 iOS 性能优化 - Allocations分析内存分配

  • iOS底层探究 - 内存对齐

    目录1:内存对齐的原因2:内存对齐的规则3:结构体内存分配演练以及在iOS中对象成员的内存分配探索 一 :内存对齐...

  • iOS内存分配

    iOS的内存分配大致可以分为以下五种:代码区、全局/静态区、常量区、堆区和栈区。 占用内存的行为 创建对象 定义变...

  • iOS内存分配

    1 RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器。 RAM(random access memo...

  • iOS内存分配

    摘自阳君的博客 1. RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器。 1.RAM(random ...

  • iOS内存分配

    内存分区:1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数...

  • iOS内存分配

    iOS对象有3种: 实例对象 类对象 元类对象 对象(对象都是结构体)的内存中,包含的指针: isa 实例对象is...

  • iOS 内存分配

    1.栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯...

  • iOS内存分配

    1.对象占用内存 我们在开发的过程中,会使用到很多的对象,每个对象都需要分配内存,某些情况下,我们需要完成一个业务...

网友评论

      本文标题:iOS的内存分配

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