iOS 堆与栈

内存模型.png

栈区(Stack)(先进后出)

就想象成:客栈,上下班准时,有规律,不用住宿的游客管理,由客栈内部人管理。
由编译器自动分配释放,存放函数的参数值,局部变量的值,操作方式类似于数据结构中的栈。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出

堆区(heap)(先进先出)

就想象成:堆在一起的东西,需要我们自己去整理。
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。用于存放对象。
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。堆是由new/alloc分配的内存,一般速度比较慢,而且容易产生内存碎片
如:

- (void)test:(NSString*)str{
   NSArray *array = [[NSArray alloc] init];
   [array release];
}

堆与栈.png
在MRC,我们如果将array = nil,而没有[array release];那么导致指针没了,堆中的对象还存在,但无法再被引用,就造成了内存泄漏。

在ARC,当方法结束后,栈中的array被编译器自动释放,就没有指针指向堆中的该对象了,编译器就会自动插入调用release回收该对象,因而不会导致内存泄漏。

野指针:当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称野指针.

全局区(静态区)

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放

常量区

存放常量,程序结束后由系统释放

代码区

存放函数体的二进制代码

声明:本文非原创,仅仅整理一些开发技能知识文章,以作存档学习用
参考:

  1. iOS开发–堆与栈的区别
  2. iOS 栈内存与堆内存
  3. 聊聊iOS开发中堆与栈的区别

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值