美文网首页iOS面试汇总
iOS内存管理(6)-堆栈的理解和区别

iOS内存管理(6)-堆栈的理解和区别

作者: 奔跑吧小蚂蚁 | 来源:发表于2018-07-09 15:29 被阅读33次

    什么行为会增加APP的内存占用

    • 创建一个oc对象
    • 定义一个变量
    • 调用一个函数或者方法

    内存管理范围

    • 任何继承了NSObject的对象
    • 对其它非对象类型无效
      简单来说:
      只有oc对象需要进行内存管理
      非oc对象类型比如基本数据类型不需要进行内存管理

    堆栈的区别:

    1、堆空间的内存是动态分配的、一般存放对象、并且需要手动释放内存。

    2、栈空间的内存是由系统自动分配、一般存放局部变量等、不需要手动管理内存。

    引入堆和栈的概念

    • 所以问题就来了,为什么OC对象需要进行内存管理,而其它非对象类型比如基本数据类型就不需要进行内存管理呢?
    • 只有OC对象才需要进行内存管理的本质原因?

    因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release
    OC对象存放于堆里面(堆内存要程序员手动回收)
    非OC对象一般放在栈里面(栈内存会被系统自动回收)
    堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存

    从管理方式来讲:

    • 对于栈来讲,是由编译器自动管理,无需我们手工控制;

    • 对于堆来说,释放工作由程序员控制,容易产生内存泄露(memory leak)

    从申请大小大小方面讲:

    • 栈空间比较小<2M>

    • 堆空间比较大

    从数据存储方面来讲:

    • 栈空间中一般存储基本类型,对象的地址

    • 堆空间一般存放对象本身,block的copy等

    堆栈的区别

    栈是吃了吐(LIFO先进后出)
    堆是吃了拉(FIFO先进先出):

    总感觉讲解的不够深入,也希望大神给予深入的方向。

    相关文章

      网友评论

        本文标题:iOS内存管理(6)-堆栈的理解和区别

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