区块链技术博客
www.b2bchain.cn

iOS程序的内存布局求职学习资料

本文介绍了iOS程序的内存布局求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

iOS程序安装之后,是以Mach-o文件的格式保存在iOS设备里面,当启动程序时,对应的Mach-o文件就会被加载进内存。那么iOS程序的内存布局是什么样子的呢?

先上图:
iOS程序的内存布局

代码区

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

全局/静态区

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

常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。

堆区

  • 是不连续的内存从低地址向高地址存储,遵循先进先出(FIFO)原则。
  • 堆的地址空间iOSx86架构下以0X6开头,空间的分配是动态的。
  • 需要关注变量的生命周期,不及时释放会造成内存泄露。
  • OC中使用alloc、new开辟空间创建的对象内存放在堆区(而指向内存的指针还是在栈里)。
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。

栈区

  • 是一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。
  • 在x86架构下,栈的地址一般为0X7开头。
  • 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。
  • 参数、函数、局部变量都放在栈区。
  • 参数入栈是从前往后入栈。而结构体入栈是从后往前入栈。

栈区与堆区对比

  • 栈是一段连续的内存区域,堆是不连续的内存
  • 栈系统自动回收内存,堆需要开发人员手动释放
  • 栈内存大小有限制,内存空间小,堆内存空间大

代码验证

“`
int a = 1; //已初始化全局变量

iOS程序安装之后,是以Mach-o文件的格式保存在iOS设备里面,当启动程序时,对应的Mach-o文件就会被加载进内存。那么iOS程序的内存布局是什么样子的呢?

先上图:
iOS程序的内存布局

代码区

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

全局/静态区

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

常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。

堆区

  • 是不连续的内存从低地址向高地址存储,遵循先进先出(FIFO)原则。
  • 堆的地址空间iOSx86架构下以0X6开头,空间的分配是动态的。
  • 需要关注变量的生命周期,不及时释放会造成内存泄露。
  • OC中使用alloc、new开辟空间创建的对象内存放在堆区(而指向内存的指针还是在栈里)。
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。

栈区

  • 是一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。
  • 在x86架构下,栈的地址一般为0X7开头。
  • 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。
  • 参数、函数、局部变量都放在栈区。
  • 参数入栈是从前往后入栈。而结构体入栈是从后往前入栈。

栈区与堆区对比

  • 栈是一段连续的内存区域,堆是不连续的内存
  • 栈系统自动回收内存,堆需要开发人员手动释放
  • 栈内存大小有限制,内存空间小,堆内存空间大

代码验证

“`
int a = 1; //已初始化全局变量

iOS程序安装之后,是以Mach-o文件的格式保存在iOS设备里面,当启动程序时,对应的Mach-o文件就会被加载进内存。那么iOS程序的内存布局是什么样子的呢?

先上图:
iOS程序的内存布局

代码区

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

全局/静态区

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

常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。

堆区

  • 是不连续的内存从低地址向高地址存储,遵循先进先出(FIFO)原则。
  • 堆的地址空间iOSx86架构下以0X6开头,空间的分配是动态的。
  • 需要关注变量的生命周期,不及时释放会造成内存泄露。
  • OC中使用alloc、new开辟空间创建的对象内存放在堆区(而指向内存的指针还是在栈里)。
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。

栈区

  • 是一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。
  • 在x86架构下,栈的地址一般为0X7开头。
  • 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。
  • 参数、函数、局部变量都放在栈区。
  • 参数入栈是从前往后入栈。而结构体入栈是从后往前入栈。

栈区与堆区对比

  • 栈是一段连续的内存区域,堆是不连续的内存
  • 栈系统自动回收内存,堆需要开发人员手动释放
  • 栈内存大小有限制,内存空间小,堆内存空间大

代码验证

“`
int a = 1; //已初始化全局变量

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS程序的内存布局求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们