ios 内存管理的理解(二)ARC概念及原理
1、什么是ARC?
Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好~这是ARC的基本原则。
当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
手动管理内存, 可以简称MRC (Manual Reference Counting)
ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”运行时特性。
2、ARC工作原理及判断准则
- ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease。
- 编译器会自动生成内存管理的代码,不需要程序员手动编写。
ARC的判断准则:
只要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。
3、ARC机制图解
NSString *firstName = @“oneV”;
这个时候firstName持有了@“OneV”。
当然,一个对象可以拥有不止一个的持有者(这个类似MRC中的retainCount>1的情况)。在这个例子中显然self.textField.text也是@“OneV",那么现在有两个指针指向对象@"OneV”(被持有两次,retainCount=2,其实对NSString对象说retainCount是有问题的,不过anyway~就这个意思而已)。
过了一会儿,也许用户在textField里输入了其他的东西,那么self.textField.text指针显然现在指向了别的字符串,比如@“onevcat",但是这时候原来的对象已然是存在的,因为还有一个指针firstName持有它。现在指针的指向关系是这样的:
只有当firstName也被设定了新的值,或者是超出了作用范围的空间(比如它是局部变量但是这个方法执行完了或者它是实例变量但是这个实例被销毁了),那么此时firstName也不再持有@“OneV",此时不再有指针指向@“OneV”,在ARC下这种状况发生后对象@"OneV"即被销毁,内存释放。
类似于firstName和self.textField.text这样的指针使用关键字strong进行标志,它意味着只要该指针指向某个对象,那么这个对象就不会被销毁。反过来说,ARC的一个基本规则即是,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上和MRC时代retain的property是比较相似的。既然有strong,那肯定有weak,weak类型的指针也可以指向对象,但是并不会持有该对象。比如:__weak NSString *weakName = self.textField.text 得到的指向关系是:
这里声明了一个weak的指针weakName,它并不持有@“onevcat"。如果self.textField.text的内容发生改变的话,根据之前?到的"只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁”原则,此时指向@“onevcat"的指针中没 有strong类型的指针,@"onevcat"将被销毁。
同时,在ARC机制作用下,所有指向这个对象的weak指针将被置为nil。这个特性相当有用,相信无数的开发者都曾经被指针指向已释放对象所造成的EXC_BAD_ACCESS困扰过,使用ARC以后,不论是strong还是weak类型的指针,都不再会指向一个dealloced的对象,从根源上解决了意外释放导致的崩溃。
不过在大部分情况下,weak类型的指针可能并不会很常用。比较常见的用法是在两个对象间存在包含关系时:对象1有一个strong指针指向对象2,并持有它,而对象2中只有一个weak指针指回对象1,从而避免了循环持有。
一个常见的例子就是oc中常见的delegate设计模式,viewController中有一个strong指针指向它所负责管理的UITableView,而UITableView中的dataSource和delegate指针都是指向viewController的weak指针。可以说,weak指针的行为和MRC时代的assign有一些相似点,但是考虑到weak指针更聪明些(会自动指向nil),因此还是有所不同的。
4 ARC机制判断
- iOS5以后,创建项目默认的都是ARC。
- ARC机制下有几个明显的标志:
不允许使用retain或者release方法
不允许调用autorelease方法
重写父类的dealloc方法时,不能再调用 [super dealloc];
ios 内存管理的理解(二)ARC概念及原理相关推荐
- OC 知识:彻底理解 iOS 内存管理(MRC、ARC)
1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...
- ios 内存管理的理解(三)ARC下 对象内存管理
1 ARC工作原理详述 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease 2 ...
- ios 内存管理的理解(一) 简述
1. 内存管理的范围 所有的OC对象(继承自NSObject类) 本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中. 当代码块结束时,这个代码块 ...
- ios 内存管理的理解(五)ARC使用特点及注意事项
1 ARC使用特点及注意事项 不允许调用release,retain,retainCount 允许重写dealloc方法,但是不允许调用[super dealloc] 2 ARC使用注意事项 ARC中 ...
- ios 内存管理的理解(四)ARC下循环引用问题
案例 一个人拥有一只狗,一只狗拥有一个主人. @interface Person :NSObject@property(nonatomic,strong) Dog* dog; @end @interf ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...
- iOS 开发:彻底理解 iOS 内存管理(MRC 篇)
本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...
- iOS内存管理(ARC,MRC)
iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...
- iOS - 内存管理 01
iOS - 内存管理 01 一.概述 内部管理简单来说就是计算机内部存储的管理,我们从冯·诺依曼结构说起,冯·诺依曼结构指出了计算机由运算器.控制器.存储器.输入和输出设备几大部件组成.拿 iPhon ...
最新文章
- python基础教程:list转换range()的打印结果
- win 10下方搜索栏没见了解决方法
- 自定义方法中英文字符截取
- 后台服务系统之搭建ZooKeeper注册中心
- c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf
- mysql listagg函数 长度过长_MySQL索引是什么?怎么做?
- java继承与多态 心得体会_继承与多态感想
- 【转】Linux配置使用SSH Key登录并禁用root密码登录
- 威纶通触摸屏可以解密吗_【实例】西门子PLC变频器和触摸屏综合应用
- 免费的WordPress Video Player插件
- 2016版excel_一招鲜,吃遍天之四:高效办公必备工具——Excel 易用宝
- 用计算机写作文教学反思,语文作文教学反思(精选6篇)
- canvas实现扭蛋机动画效果
- 小米电视android刷机,小米电视怎么root 小米电视如何安装第三方软件 解决方法图解...
- 如何查看自己电脑开启了哪些端口号
- 【转】How-To-Ask-Questions-The-Smart-Way
- 差分相干解调 matlab,2DPSK差分相干解调器Simulink仿真
- 关于应届生找工作的面试心得--越努力才会越幸运
- 国产COS操作系统为何要逆流而上?
- Linux设备驱动程序架构分析之I2C架构(基于3.10.1内核)
热门文章
- MakeItTalk:Adobe 语音驱动的头部动画
- 【python教程入门学习】用Python制作迷宫GIF
- js添加关闭功能_微信小程序开发之添加夜间模式功能
- 边缘AI计算新时代,人工神经网络秒变脉冲神经网络
- 带你自学Python系列(十四):Python函数的用法(四)
- 非局部均值(Nonlocal-Mean)
- nginx php exec,PHP Web 端如何操作 Nginx 配置
- 二叉树线索化示意图_二叉树的线索化
- python3从零开始学习_从零开始学习PYTHON3讲义(十五)让画面动起来
- labview串口数据采集并显示_一种NB-IoT冶金节点温度采集与远程监测系统的设计...