iOS开发系列-ARC浅解

1、什么是 ARC ?

所谓ARC就是Automatic Reference Counting , 即自动引用计数。ARC是自iOS5引入的。ARC机制的引入是为了简化开发过程的内存管理的。相对于以前的MRC (Manual Reference Counting) , ARC机制显得更加自动化。在使用ARC开发过程当中,开发者只需考虑strong / weak 的使用,再也不须要考虑对象什么时候要retain,release/autorealease。使用ARC通常不会下降程序的效率。ios

2、ARC的工做原理

ARC一个很重要的原则是:只要某个对象被任一strong指针指向,那么它将不会被销毁。若是对象没有被任何strong指针指向,那么就将被销毁spa

ARC是基于引用计数的,当某个对象被一个strong指针指向时,它的计数+1。当没有strong指针指向时,其计数为0,此时对象会被销毁。只要一个对象有至少一个strong指针指向时,它就不会被销毁。但ARC容易形成一个 Strong Reference Cycle 的问题,这样即便AddBook 和 Entry 这两个对象都再也不使用了,可是因为ARC机制,这两个对象都互相有strong指针指向,因此这两个对象都不会被回收,从而形成内存没法被释放。指针

针对上面的状况,有一种解决方法:在其中一个对象中引入weak,替换其strongcode

引入weak后,当entry使用完后,因为指向AddrBook没有strong指针,因此AddrBook会首先被释放,而后因为AddrBook被释放,指向Entry的Strong指针也会销毁,此时没有指向Entry的strong指针,因此Entry也会被释放。这样就不会出现内存没法被释放的状况。对象

这里就有一个问题了,何时应该用strong,何时应该用weak呢?看如下解析:blog

如图所示,ViewController直接持有View,因此ViewController应该要有一个strong指向view。同理,view直接持有subviews,因此也应该要有strong指向subviews。因为viewcontroller要使用subviews对象,但又不想直接持有subviews,因此只好经过weak指向subviews。这样的话,能够在viewcontroller中不改变view的持有关系,就能够使用subviews对象。从图中能够得出一个通用的规律:对于有直接持有的关系,持有者要经过strong指向被持有者。对于有间接持有关系的,间接持有者需经过weak指向间接被持有者。内存

 

参考文章:http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2开发

        http://onevcat.com/2012/06/arc-hand-by-hand/get

相关文章
相关标签/搜索