【iOS内存管理-内存的几大区域】

这篇具有很好参考价值的文章主要介绍了【iOS内存管理-内存的几大区域】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

iOS内存管理的第一篇章,了解iOS内存的五大分区。

总览

iOS中,内存主要分为五大区域:栈区,堆区,全局区/静态区,常量区和代码区。总览图如下。【iOS内存管理-内存的几大区域】,ios,cocoa,macos,objective-c
如上图所示,代码区是在低地址段存放,而栈区则存放在高地址段,并且各个分区之间不是连续的。

1. 栈

1.1 介绍

  • 栈是从高地址向低地址存储的一块连续的内存区域,特点是先进后出(FILO)
  • 栈的地址空间在在iOS里面是0X7/ 0X16开头
  • 栈区一般是在运行时分配内存,内存空间由系统管理,也就是变量在超出了自身的作用范围之后就会被释放。
  • 包含函数内部定义的局部变量以及方法参数(方法的默认参数 self,cmd) 等也都是存放在栈区。

1.2 优缺点

  • 注意,栈区的内存是由系统分配并管理的,所以它会由系统分配并自己释放,不会产生内存碎片,更快更高效。
  • 但是栈的内存大小被系统所限制所导致其并不是很灵活,iOS主线程栈的大小1MB,其他线程512KB,Mac为8M。【iOS内存管理-内存的几大区域】,ios,cocoa,macos,objective-c
- (void)testStack {
    int a = 10;

    NSLog(@"a == %p size == %lu",&a,sizeof(a));
    NSLog(@"方法参数 self:%p",&self);
    NSLog(@"方法参数 cmd:%p",&_cmd);
}

【iOS内存管理-内存的几大区域】,ios,cocoa,macos,objective-c

2. 堆区

  • 堆是从低地址向高地址的不连续的内存区域,和链表的结构很相似(便于增删但是不便于查询),特点是先进先出FIFO。
  • 堆地址是以0X6进行开头,动态的分配空间
  • 在堆里存放的东西需要我们手动的管理和释放,若不及时释放就会造成内存泄漏。
  • 在OC里面alloc和new都会为对象开辟空间到堆上
- (void)testHeap {
    NSObject *object1 = [NSObject new];
    NSObject *object2 = [NSObject new];
    NSLog(@"object1 = %@",object1);
    NSLog(@"object2 = %@",object2);
}

【iOS内存管理-内存的几大区域】,ios,cocoa,macos,objective-c

栈和堆的区别联系

1. 各自的优缺点?

  • 栈:由编译器自动分配并释放,速度较快,不会产生内存碎片。优点是快速高效,缺点时有限制,数据不灵活。
  • 堆:由程序员分配和释放,速度比较慢,而且容易产生内存碎片,不过用起来最方便。优点是灵活方便,数据适应面广泛,但是效率有一定降低。

2. 申请后的系统如何响应?

  • 栈:存储每一个函数在执行的时候都会向操作系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
  • 堆:操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

3. 申请大小的限制?

  • 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数 ) ,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
  • 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

3. 全局/静态区

  • 该区是编译时分配的内存空间,在iOS中一般以0x1开头,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 未初始化的全局变量和静态变量,即BSS区(.bss)。
  • 已初始化的全局变量和静态变量,即数据区(.data)。

其中,全局变量是指变量值可以在运行时被动态修改,而静态变量是static修饰的变量,包含静态局部变量和静态全局变量
关于static关键字之前有学习过深入理解Static关键字

int clB;
static int bssB;
int initClB = 10;
static int initBssB = 11;
- (void)testStatic {
    NSLog(@"clA = %p", &clB);
    NSLog(@"bssB = %p", &bssB);
    NSLog(@"initClB = %p", &initClB);
    NSLog(@"initBssB = %p", &initBssB);
   

}

【iOS内存管理-内存的几大区域】,ios,cocoa,macos,objective-c
clB 和 bssB都是未初始化,在内存是连续的地址,相差为4。
initClB和 initBssB都是初始化的数据,内存地址也是连续的。

4. 常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。
  • 常量区是编译时分配的内存空间,在程序结束后由系统释放,主要存放:
    ■ 已经使用了的,且没有指向的字符串常量
    ■ 字符串常量因为可能在程序中被多次使用,所以在程序运行之前就会提前分配内存。

5. 代码区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放
  • 程序运行时的代码会被编译成二进制,存进内存的代码区域。

总结

初步了解了iOS的内存区域,主要是栈和堆的区别和联系需要我们了然于心。文章来源地址https://www.toymoban.com/news/detail-569558.html

到了这里,关于【iOS内存管理-内存的几大区域】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习iOS高质量开发】——熟悉Objective-C

    Objective-C和Java、C++都是面向对象语言但是语法上有些许不同。OC使用“消息结构”而不是“函数调用”,这二者的区别主要体现在: 使用消息结构的语言,其运行所应执行的代码由运行环境来决定;使用函数调用的语言,则由编译器决定。OC的重要工作都是由运行期组件来完

    2024年01月19日
    浏览(49)
  • Objective-C学习笔记(内存管理、property参数)4.9

    1.引用计数器retainCount: 每个对象都有这个属性,默认值为1,记录当前对象有多少人用。    为对象发送一条retain/release消息,对象的引用计数器加/减1,为对象发一条retainCount,得到对象的引用计数器值,当计数器为0时自动调用对象的dealloc方法。    手动发送消息:-(id)perf

    2024年04月13日
    浏览(44)
  • 初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁

    当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细介绍FreeRTOS的特性、任务调度、内存管理、通信机制以及一些示例代码。 FreeR

    2024年02月14日
    浏览(39)
  • CSS_IOS适配状态栏和IOS底部安全区域

    计算属性 先constant再env 计算属性 safe-area-inset-left: 安全区域距离左边界的距离 safe-area-inset-right: 安全区域距离右边界的距离 safe-area-inset-top: 安全区域距离顶部边界的距离 safe-area-inset-bottom: 安全区域距离底部边界的距离

    2024年02月10日
    浏览(40)
  • 适配 IOS 安全区域

    安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响。 造成这个问题的主要原因就是 iphoneX 之后在屏幕上出现了所谓的刘海屏,而且在屏幕下方加了一条小黑条。 在开发时,需要对顶部和底部预留一

    2024年01月23日
    浏览(118)
  • IOS安全区域适配

    对于 iPhone 8 和以往的 iPhone,由于屏幕规规整整的矩形,安全区就是整块屏幕。但自从苹果手机 iphoneX 发布之后,前端人员在开发移动端Web页面时,得多注意一个对 IOS 所谓 安全区 域范围的适配。这其实说白了就是 iphoneX 之后的苹果手机,在页面上,你需要对顶部和底部多预

    2024年02月03日
    浏览(35)
  • uniapp中ios底部安全区域问题

    1、App:在manifest.json源码视图中找到app-plus,添加safearea配置 2、给page设置CSS 3、找到template.h5.html文件,给meta添加viewport-fit=cover

    2024年02月11日
    浏览(40)
  • 常见的几大排序问题

           前言:排序问题,是数据结构中的一大重要的组成板块,很多的面试机试中都会多多少少的涉及到排序问题,之前在上数据结构的那个学期整理过排序问题,不过大都是囫囵吞枣,不求甚解,今天,我们就来详细的,将几大排序算法展开,从0到1的进行理解和学习。考

    2024年02月13日
    浏览(37)
  • IO的几个模型

    说到I/O模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词,以下讲解这几个词的概念。 阻塞和非阻塞 阻塞和非阻塞指的是一直等还是可以去做其他事。 阻塞(一直等水烧开)(blocking): 调用结果返回之前,调用者被挂起(当前线程进入非可执行状态,在这个状态,CPU不

    2024年02月12日
    浏览(44)
  • macos编译libtiff库给IOS用

         

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包