• 前言

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

    内存管理

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

    (吐槽一下:iPhone6s还是16G起步,还好我也买不起->_-> 扯远了~~~)

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

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

    内存管理范围

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

    引入堆和栈的概念

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

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

    举例说明

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

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

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

    总结区别

    • 按管理方式分

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

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

    栈是吃了吐 堆是吃了拉

  • 从管理方式来讲
    • 对于栈来讲,是由编译器自动管理,无需我们手工控制;
    • 对于堆来说,释放工作由程序员控制,容易产生内存泄露(memory leak)
  • 从申请大小大小方面讲
    • 栈空间比较小
    • 堆控件比较大
  • 从数据存储方面来讲
    • 栈空间中一般存储基本类型,对象的地址
    • 堆空间一般存放对象本身,block的copy等

ios 基础知识篇 堆和栈的区别的更多相关文章

  1. 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

    1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...

  2. iOS面试必备-iOS基础知识

    近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...

  3. iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...

  4. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  5. 【Java面试】1、基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充. 源码分享:https: ...

  6. Java白皮书学习笔记+Head First Java--用于自我复习 基础知识篇

    本笔记是摘与Hava白皮书上面的内容,用来给自己做提醒的,因此大概并不适合Java的学习者作为笔记参考使用. 以我的水平现在还看不懂这个... 一.基础知识篇 1.常量 final关键字指示常量,只能 ...

  7. 超详细的Java面试题总结(二)之Java基础知识篇

    多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...

  8. iOS 堆和栈的区别和联系

    堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地 ...

  9. iOS面试-堆和栈的区别

    堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...

随机推荐

  1. SQL 本地数据库

      先写一个数据库帮助器: public class MyDBHelper extends SQLiteOpenHelper { private static final String DB_NAME ...

  2. UmBasketella

    UmBasketella http://poj.org/problem?id=3737 Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  3. vue项目微信分享之后路由链接被破坏怎么办

    异常现象: 多页面应用,路由采用hash模式,链接带有"#". 在微信中分享到朋友圈或好友时,分享出去的路由被破坏,打开分享的链接,路由中的“#”会被去掉并追加?fromTimel ...

  4. 问题1:jquery实现全选功能,第二次失效(已解决)

    问题:使用了attr("checked",true”)设置子复选框的被选状态,第一次执行功能正常,但第二次失效. 解决方案:将attr("checked",tr ...

  5. js常用的数组,,字符串,,Math..正则方法

    数组 slice[start,end] 返回从原数组中指定开始下标到结束下标之间的项目组成新数组(不会影响原数组) splice() 1.删除功能:2个参数 , 起始位置 , 删除的项目 2.插入功能 ...

  6. django的request介绍和APIView流程分析和CBV的流程分析

    首先get请求的数据都在request.GET中,request.body中没有,因为只有post请求有请求体,request.body中的数据是请求体的数据 首先,我们还是用cbv的方式来讲解 我们 ...

  7. 不常见的javascript调试技巧

    原文链接:https://segmentfault.com/a/1190000011857058 有时, 有一组复杂的对象要查看.可以通过console.log查看并滚动浏览,亦或者使用console ...

  8. Maven学习笔记(十二)-maven打包之resource配置

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011781521/article/details/79052725 一.简介 构建Maven项目的 ...

  9. Linq 查询 List集合

    总是听到身边的同事说起Linq ,知道上学的时候学过,可是自从毕业之后就再也没用过,总觉得是很牛的技能 ,可是当自己真正学会用的时候才发现,我去,So easy .废话不多说直接上代码吧 var li ...

  10. SQL创建删除索引

    --创建唯一聚集索引create unique clustered index pk_table1 on table1 (column1) --创建唯一非聚集索引create unique noncl ...