在iOS中内存分为五大区域:栈去、堆区、全局区、常量区、代码区
内存分区
高地址向低地址扩展
的系统数据结构,对应的进程或者线程
是唯一的连续的内存区域
,遵循先进后出(FILO)
原则运行时分配
,在iOS中以0x7开头
由编译器自动分配并释放
的,主要用来存储:局部变量、函数参数(如隐藏参数(id self, SEL _cmd))
编译器自动分配并释放
的,不会产生内存碎片,快速且高效
内存大小有限制,数据不灵活
, 低地址向高地址扩展
的数据结构不连续的内存区域
,类似链表结构
(便于增删,不便于查找),遵循先进先出(FOFI)
原则运行时分配的
,在iOS中以0x6开头
程序员动态分配和释放的
,如果程序员没有释放,在程序结束后由系统回收,主要用来存储:开辟空间创建对象
通过对象读取到栈区的指针地址
,然后通过指针地址访问堆区
灵活方便,适应面广泛
手动管理,速度慢
,容易产生内存碎片
编译时期分配
的内存空间,在程序运行期间,数据一直存在,程序结束后系统释放
0x1开头
可读可写区域
主要用来存放:
未初始化
的全局变量
和静态变量
,即BSS区已初始化
的全局变量
和静态变量
,即DATA区 全局变量
是指变量值可以在运行时被动态修改
,而静态变量
是static修饰
的变量,包含静态局部变量
和静态全局变量
编译时期分配
的内存空间,程序结束后系统自动释放
只读区域
字符串常量
多次使用
,所有在程序运行前提前分配内存
编译时分配
只读区域
程序运行的代码
,代码会编译成二进制存到内存
函数在运行中且未完成时期占用的一块独立的连续内存区域
每一个线程都有专用的栈空间
,该栈空间可以在线程期间自由使用,当前线程的函数共享
改栈空间,每一个函数使用的栈空间是一个栈帧,所有的栈帧组成了这个线程完整的栈
函数的调用是发生在栈上
,每一个函数的相关信息(局部变量,调用记录等)都存储在一个栈帧中
,每执行一次函数调用
就会生成一个新的栈帧,然后将其压入函数栈
,当函数执行结束时,则将函数对应的栈帧出栈并释放
一般情况下我们是不需要考虑堆栈的大小问题,但是堆栈不是无上限的,过多的递归会导致栈溢出
,过多的alloc会导致堆溢出
预付堆栈溢出的方法:
调用系统API修改线程的堆栈大小
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。