在这不得不说OC中内存管理的三种分类: 设计模式
Mannul Reference Counting(MRC,手动管理,在开发iOS5.0以前的版本号的项目时咱们要本身负责使用引用计数来管理内存,比方要手动retain、release、autorelease 等,而在其后的版本号可以使用ARC,让系统本身管理内存。post
)ui
Automatic Reference Counting(ARC,本身主动引用计数,iOS5.0 以后推出的)spa
Garbage Collection(垃圾回收)。设计
iOS不支持垃圾回收; ARC做为苹果新 供的技术,苹果推荐开发人员使用ARC技术来管理内存;指针
那么今天就着重探讨一下ARC!!!code
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:编译器特性
“垃圾回收”:执行时特性
ARC是Objective-C编译器的特性,而不是执行时特性或者垃圾回收机制,ARC所作的仅仅只是是在代码编译时为你本身主动在合适的位置插入release或autorelease
仅仅要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,临时忘记“引用计数器”,因为推断标准变了。
1) 强指针:默认的状况下,所有的指针都是强指针,keyword__strong
2) 弱指针:__weak
keyword修饰的指针
声明一个弱指针例如如下:
__weak Person *p;
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类型的指针也可以指向对象,但是并不会持有该对象。
比方:
__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底层的处理机制有更深的认识了吧!
欢迎你们提出补充哦。