美文网首页
iOS堆和栈的使用小结

iOS堆和栈的使用小结

作者: 奔跑的小蚂蚁_8b28 | 来源:发表于2021-08-16 08:48 被阅读0次

    堆和栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。堆,队列优先,先进先出(FIFO—first in first out);栈,先进后出(FILO—First-In/Last-Out)。一般情况下,如果有人把堆栈合起来说,那它的意思是栈,而不是堆。

    1、管理方式不同;

    管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

    2、空间大小不同;

    空间大小:栈是一块空间较小,但是运行速度很快的内存区域。栈上的内存分配遵循后进先出的原则,通过移动栈的尾指针实现 push(入栈)和 pop(出栈)操作。我们的程序是由一个个方法组成的,CPU 会负责调度并执行这些方法。当我们的程序执行到某个方法的时候,需要在栈上为方法需要的内存开辟空间,此时把栈的尾指针向栈底移动。当方法执行完毕后需要释放掉这些空间,此时会把栈的尾指针移向栈顶,这就完成了一次栈上的内存分配。只要栈的剩余空间大于stack 对象申请创建的空间,操作系统就会为程序提供这段内存空间,否则将报异常提示栈溢出。

    堆是内存中的另一块区域,空间比栈大的多,但是运行速度要比栈上的运行速度慢。堆可以在运行时动态的分配内存,补充栈上内存分配的不足。一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。

    总之记住一句话,OC对象存放于堆里面(堆内存要程序员手动回收),非OC对象一般放在栈里面(栈内存会被系统自动回收)

    Swift中的使用

    Swift 中的数据类型分为引用类型(类)和值类型(枚举、结构体)。引用类型存储在 “堆” 上,值类型存储在 “栈” 上。Swift 管理引用类型采用自动引用计数(ARC)的管理方法。值类型是由处理器来管理的,不需要程序员来管理。

    相关文章

      网友评论

          本文标题:iOS堆和栈的使用小结

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