在浅谈Android引用计数(1)中讲了LightRefBase实现对象计数管理的原理,这篇文章将要分析重量级的引用基类:RefBase的实现和它的作用。

下面是RefBase和相关类的类图:

图中可以看出,RefBase类有一个成员变量 mRefs,它指向一个weakref_impl对象。这个对象管理这RefBase的生命周期,其中weakref_impl类中有两个引用计数:一个表示强引用的个数,一个表示弱引用的个数。

RefBase的生命周期控制方式有两种:

1.受强引用控制:即weakref_impl类中的mFlag的值为OBJECT_LIFETIME_STRONG;

2.受弱引用控制:即weakref_impl类中的mFlag的值为OBJECT_LIFETIME_WEAK;

当生命周期控制方式为1的时候,weakref_impl中的强引用计数为0的时候就会销毁RefBase对象,但是不会销毁weakref_impl对象。

当生命周期控制方式为2的时候,只有当强弱引用都为0的时候,才会销毁RefBase,同时也会销毁weakref_impl。

要想自己定义的类也能实现引用计数的管理,就要继承RefBase。RefBase默认的生命周期控制方式是受强引用控制。在使用wp中的保存的m_ptr指针的时候一定要检查指针是否有效,要调用promote()函数,检查返回的sp是否为空,如果为空表示RefBase已经被销毁。