一、什么是 arc ?
所谓arc就是automatic reference counting , 即自动引用计数。arc是自ios5引入的。arc机制的引入是为了简化开发过程的内存管理的。相对于之前的mrc (manual reference counting) , arc机制显得更加自动化。在使用arc开发过程中,开发者只需考虑strong / weak 的使用,不再需要考虑对象何时要retain,release/autorealease。使用arc一般不会降低程序的效率。
arc一个很重要的原则是:只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。
arc是基于引用计数的,当某个对象被一个strong指针指向时,它的计数+1。当没有strong指针指向时,其计数为0,此时对象会被销毁。只要一个对象有至少一个strong指针指向时,它就不会被销毁。但arc容易造成一个 strong reference cycle 的问题,这样即使addbook 和 entry 这两个对象都不再使用了,但是由于arc机制,这两个对象都互相有strong指针指向,所以这两个对象都不会被回收,从而造成内存无法被释放。
针对上面的情况,有一种解决方法:在其中一个对象中引入weak,替换其strong
引入weak后,当entry使用完后,由于指向addrbook没有strong指针,所以addrbook会首先被释放,然后由于addrbook被释放,指向entry的strong指针也会销毁,此时没有指向entry的strong指针,所以entry也会被释放。这样就不会出现内存无法被释放的情况。
这里就有一个问题了,什么时候应该用strong,什么时候应该用weak呢?看以下解析:
如图所示,viewcontroller直接持有view,所以viewcontroller应该要有一个strong指向view。同理,view直接持有subviews,所以也应该要有strong指向subviews。由于viewcontroller要使用subviews对象,但又不想直接持有subviews,所以只好通过weak指向subviews。这样的话,可以在viewcontroller中不改变view的持有关系,就可以使用subviews对象。从图中可以得出一个通用的规律:对于有直接持有的关系,持有者要通过strong指向被持有者。对于有间接持有关系的,间接持有者需通过weak指向间接被持有者。
最新内容请见作者的github页:http://qaseven.github.io/