• 前言

    堆和栈是什么?有什么区别?是干嘛的?

    内存管理

    移动设备的内存及其有限,每一个APP所能占用的内存是有限制的

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

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

    内存管理范围

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

    引入堆和栈的概念

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

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

    举例说明

    该代码块在内存中的表现形式如下图

    图中可以看到,栈里面存放的是非对象的基本数据类型,堆内存存放着oc对象

    当代码块一过,里面的a,b,*c指针都会被系统编译器自动回收,因为它存放在栈里面,而OC对象则不会被系统回收,因为它存放堆里面,堆里面的内存是动态存储的,所以需要程序员手动回收内存

    总结区别

    • 按管理方式分
      • 对于栈来讲,是由系统编译器自动管理,不需要程序员手动管理
      • 对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露
    • 按分配方式分
      • 堆是动态分配和回收内存的,没有静态分配的堆
      • 栈有两种分配方式:静态分配和动态分配
        • 静态分配是系统编译器完成的,比如局部变量的分配
        • 动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理

    一位网友用10个字总结了堆和栈的区别

    栈是吃了吐 堆是吃了拉

  • 从管理方式来讲
    • 对于栈来讲,是由编译器自动管理,无需我们手工控制;
    • 对于堆来说,释放工作由程序员控制,容易产生内存泄露(memory leak)
  • 从申请大小大小方面讲
    • 栈空间比较小
    • 堆控件比较大
  • 从数据存储方面来讲
    • 栈空间中一般存储基本类型,对象的地址
    • 堆空间一般存放对象本身,block的copy等
       
       
       
posted on 2017-11-15 10:49  代码少年_夕阳  阅读(305)  评论(0编辑  收藏  举报