今天无意中看到非常久之前的一个项目,古老的语法规范,还有更让人战战兢兢“内存管理代码”!

在这不得不说OC中内存管理的三种分类:

  • Mannul Reference Counting(MRC,手动管理,在开发iOS5.0之前的版本号的项目时我们要自己负责使用引用计数来管理内存,比方要手动retain、release、autorelease 等,而在其后的版本号能够使用ARC,让系统自己管理内存。

    )

  • Automatic Reference Counting(ARC,自己主动引用计数,iOS5.0 之后推出的)

  • Garbage Collection(垃圾回收)。

    iOS不支持垃圾回收; ARC作为苹果新 供的技术,苹果推荐开发人员使用ARC技术来管理内存;

    那么今天就着重探讨一下ARC!!!

    1、什么是ARC?

      Automatic Reference Counting,自己主动引用计数,即ARC,能够说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,能够说一举攻克了广大iOS开发人员所憎恨的手动内存管理的麻烦。

      在project中使用ARC很easy:仅仅须要像往常那样编写代码,仅仅只是永远不写retain,release和 autorelease三个keyword就好,这是ARC的基本原则。

      当ARC开启时,编译器将自己主动在代码合适的地方插入retain, release和autorelease,而作为开发人员,全然不须要操心编译器会做错(除非开发人员自己错用ARC了)。

      手动管理内存, 能够简称MRC (Manual Reference Counting)   

      ARC与其它语言的”垃圾回收”机制不同。

      ARC:编译器特性

      “垃圾回收”:执行时特性

    2、ARC工作原理及推断准则

      ARC是Objective-C编译器的特性,而不是执行时特性或者垃圾回收机制,ARC所做的仅仅只是是在代码编译时为你自己主动在合适的位置插入release或autorelease

    ARC的对象回收推断准则:

    仅仅要没有强指针指向对象,对象就会被释放。

    注意:当使用ARC的时候,临时忘记“引用计数器”,由于推断标准变了。

    3、指针分类

    1) 强指针:默认的情况下,全部的指针都是强指针,keyword__strong

    2) 弱指针:__weakkeyword修饰的指针

    声明一个弱指针例如以下:

    1. __weak Person *p;

    4、ARC机制图解

    1. 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这种指针使用keywordstrong进行标志,它意味着仅仅要该指针指向某个对象,那么这个对象就不会被销毁。

    反过来说,ARC的一个基本规则即是,仅仅要某个对象被任一strong指针指向,那么它将不会被销毁。假设对象没有被不论什么strong指针指向,那么就将被销毁。

      在默认情况下,全部的实例变量和局部变量都是strong类型的。能够说strong类型的指针在行为上和MRC时代retain的property是比較相似的。

      既然有strong,那肯定有weak咯~,weak类型的指针也能够指向对象,可是并不会持有该对象。

      比方:

    1.   __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的对象,从根源上攻克了意外释放导致的crash。



      只是在大部分情况下,weak类型的指针可能并不会非经常常使用。比較常见的使用方法是在两个对象间存在包括关系时:对象1有一个strong指针指向对象2,并持有它,而对象2中仅仅有一个weak指针指回对象1,从而避免了循环持有。

      一个常见的样例就是oc中常见的delegate设计模式,viewController中有一个strong指针指向它所负责管理的UITableView,而UITableView中的dataSource和delegate指针都是指向viewController的weak指针。

    能够说,weak指针的行为和MRC时代的assign有一些相似点,可是考虑到weak指针更聪明些(会自己主动指向nil),因此还是有所不同的。 

    通过上面的图解。大家一定对ARC底层的处理机制有更深的认识了吧!

    欢迎大家提出补充哦。

小小ARC造福无数码农的更多相关文章

  1. 走进WCF一 (异常如此多娇,引无数码农竞折煞)

    对于WCF一直都是只知其然,公司框架的架构者也只是对我们授之以鱼,而不授之以渔. 带着初学者的态度进入了大神Artech的博客,逐步慢慢上手. 我的解决方案(和大神的一模一样,只是过程中一波三折的) ...

  2. C++版修真小说

    终有一天我手中的编译器将成为我灵魂的一部分,这世界在我的眼中将被代码重构,我将看到山川无尽银河无垠都汇成二进制的数字河流,过往英雄都在我脑海眼前一一浮现,而我听到无数码农跪倒在我的程序面前呼喊. 他们 ...

  3. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  4. 咬碎STL空间配置器

    STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...

  5. OO第三次博客作业---透过代码看设计

    不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇 ...

  6. TLS协议分析

    TLS协议分析 本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...

  7. block的内部实现

    主要内容: 一.block相关的题目 二.block的定义 三.block的实现 四.捕获自动变量值 五.block存储区域 六.截获对象 一.block相关的题目 这是一篇比较长的博文,前部分是bl ...

  8. Block存储区域

    Block存储区域 首先,需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...

  9. linux库

     将库函数打包成一个单元使之能够在运行时被多个进程共享的技术,这种技术能够节省磁盘空间和RAM. 一. 静态库:1.概念:    静态库就是一些目标文件的集合,以.a结尾.静态库在程序链接的时候使用, ...

随机推荐

  1. 深入了解"网上邻居"原理

    说到“网上邻居”,相信很多人都很熟悉.但是说起“网上邻居”的工作机制,可能大家就不太清楚了. 要说“网上邻居”的工作机制,不妨联系一下生活中的例子:比如我(A),要拜访一个远方的朋友(B),我要去他的 ...

  2. ZJOI2008骑士

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境 ...

  3. C++集合运算函数总结 & 需要有序集合的操作

    前提:两个集合已经有序.merge() //归并两个序列,元素总个数不变,只是将两个有序序列归并为一个有序序列.set_union() //实现求集合A,B的并.set_difference()//实 ...

  4. NYOJ_75 日期计算 (推断这一天是这一年中的第几天)

    题目地址 如题,输入一个日期,格式如:2010 10 24 ,推断这一天是这一年中的第几天. 分析:   官方给的最优答案用了for 和switch语句结合,十分巧妙. 代码 /* 如题,输入一个日期 ...

  5. Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例

    MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...

  6. Flume的Storage&Master

    storage是存储系统,可以是一个普通file,也可以是HDFS,HIVE,HBase,分布式存储等. Master是管理协调Agent和Collector的配置等信息,是flume集群的控制器.

  7. STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

  8. 洛谷 P1100 高低位交换

    P1100 高低位交换 题目描述 给出一个小于2^32的正整数.这个数可以用一个32位的二进制数表示(不足32位用0补足).我们称这个二进制数的前16位为“高位”,后16位为“低位”.将它的高低位交换 ...

  9. C++基于矢量图形库cairo画图图形

    //sudo apt-get install libcairo2-dev //pkg-config --cflags --libs cairo //-I/usr/include/cairo -I/us ...

  10. SICP 习题 (2.10)解题总结: 区间除法中除于零的问题

    SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序猿Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断 ...