ios 基础知识篇 堆和栈的区别
前言
堆和栈是什么?有什么区别?是干嘛的?
内存管理
移动设备的内存及其有限,每一个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 基础知识篇 堆和栈的区别的更多相关文章
- 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...
- iOS面试必备-iOS基础知识
近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...
- iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了
OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- 【Java面试】1、基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充. 源码分享:https: ...
- Java白皮书学习笔记+Head First Java--用于自我复习 基础知识篇
本笔记是摘与Hava白皮书上面的内容,用来给自己做提醒的,因此大概并不适合Java的学习者作为笔记参考使用. 以我的水平现在还看不懂这个... 一.基础知识篇 1.常量 final关键字指示常量,只能 ...
- 超详细的Java面试题总结(二)之Java基础知识篇
多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...
- iOS 堆和栈的区别和联系
堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地 ...
- iOS面试-堆和栈的区别
堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...
随机推荐
- JavaScript各种继承方式(三):组合继承(combination inheritance)
一 原理 组合继承仅仅是同时使用了原型链继承和构造函数继承. 具体做法是,将父类的实例作为子类的构造函数的原型对象,并在子类的构造函数中调用父类的构造函数. function Fruit(name){ ...
- stm32阅读代码工具source insight
不知道学stm32有没有这样的烦恼,想看一个项目的代码,但是用keil又发现建立工程太麻烦,单个打开文件又找不到函数和变量之间的依赖关系,变量和函数又不能高亮显示,linux下vim和emacs虽然很 ...
- ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps(二分+线段树区间最小)
During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...
- 【转】以太网最大帧和最小帧、MTU
根据rfc894的说明,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步码 + ...
- html 导出pdf
地址: https://developers.itextpdf.com/examples/xml-worker/html-lists 主方法: public string Generate(strin ...
- 血的教训:Protocol http not supported or disabled in libcurl
报错显示:http not supported or disabled in libcurl 查看配置 curl -V ---------------------------------------- ...
- docker搭建lnmp(二)
上一篇利用 不同的命令来构建 nginx,mysql,php镜像 和 容器. 这样做比较麻烦,也很容易出错,当然可以写入 sh脚本来执行.但是可以通过 docker-compose 来达到效果,管理起 ...
- java 知识汇总
一.springboot cloud 1.maven 配置 parent:org.springframework.boot:sping-boot-starter-parent dependencies ...
- mybatis入门--mapper代理方式开发
不使用代理开发 之前,我们说了如何搭建mybatis框架以及我们使用mybatis进行简单的增删改查.现在,我们一起来构建一个dao层的完整代码.并用@test来模拟service层对dao层进行一下 ...
- C++中的npos,size_t,size_type
string类提供了6种查找函数,每种函数以不同形式find命名,这些操作全都返回string::size_type类型的值,以下标形式标记查找匹配所发生的位置,或返回一个名为string::npos ...