iOS 堆和栈的区别?
来源:互联网 发布:微博系统数据库设计 编辑:程序博客网 时间:2024/05/29 18:01
前言
堆和栈是什么?有什么区别?是干嘛的?啥东西呀这是?别急,慢慢看下去
内存管理
移动设备的内存及其有限,每一个APP所能占用的内存是有限制的
(吐槽一下:iPhone6s还是16G起步,还好我也买不起->_-> 扯远了~~~)
什么行为会增加APP的内存占用
- 创建一个oc对象
- 定义一个变量
- 调用一个函数或者方法
内存管理范围
- 任何继承了NSObject的对象
- 对其它非对象类型无效
- 简单来说:
- 只有oc对象需要进行内存管理
- 非oc对象类型比如基本数据类型不需要进行内存管理
引入堆和栈的概念
- 所以问题就来了,为什么OC对象需要进行内存管理,而其它非对象类型比如基本数据类型就不需要进行内存管理呢?
- 只有OC对象才需要进行内存管理的本质原因?
因为:
Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存
举例说明
该代码块在内存中的表现形式如下图
图中可以看到,栈里面存放的是非对象的基本数据类型,堆内存存放着oc对象
当代码块一过,里面的a,b,*c指针都会被系统编译器自动回收,因为它存放在栈里面,而OC对象则不会被系统回收,因为它存放堆里面,堆里面的内存是动态存储的,所以需要程序员手动回收内存
总结区别
- 按管理方式分
- 对于栈来讲,是由系统编译器自动管理,不需要程序员手动管理
- 对于堆来讲,释放工作由程序员手动管理,不及时回收容易产生内存泄露
- 按分配方式分
- 堆是动态分配和回收内存的,没有静态分配的堆
- 栈有两种分配方式:静态分配和动态分配
- 静态分配是系统编译器完成的,比如局部变量的分配
- 动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理
一位网友用10个字总结了堆和栈的区别
栈是吃了吐 堆是吃了拉
作者:海强_hq
链接:http://www.jianshu.com/p/c8e1d91dda99
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
阅读全文
0 0
- IOS中堆和栈的区别
- IOS中堆和栈的区别
- IOS中堆和栈的区别
- iOS中堆和栈的区别
- iOS中堆和栈的区别
- IOS中堆和栈的区别
- iOS中堆和栈的区别
- IOS中堆和栈的区别
- iOS中堆和栈的区别
- iOS中堆和栈的区别
- iOS 堆和栈的区别
- IOS中堆和栈的区别
- iOS中堆和栈的区别
- iOS 栈和堆的区别
- iOS中堆和栈的区别
- iOS 栈和堆的区别
- iOS中堆和栈的区别
- iOS中堆和栈的区别
- Valid Type Name, BindingResult bindingResult
- jQuery实现字符串全部替换的方法
- angularjs简单demo(转载,原网址找不到了)
- [日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
- 让远程主机可以通过网络访问sshd服务
- iOS 堆和栈的区别?
- the surface has been released
- 如何使用ADO助手生成数据库代码
- 前端-css样式 外边距(margin)和内边距(padding)
- Docker1.7安装及swarm集群搭建与介绍
- 炫丽横向滚动选择星期控件
- webpack
- ScheduledExecutorService实现延迟执行
- 5、Hadoop datanode无法启动,报错: java.io.IOException: Incompatible clusterIDs