简述
在java的世界里,所有的对象的申请和回收都是由虚拟机控制的,而在c和c++的世界里,我们需要自己去控制对象的生命周期,这无疑带来了极大的不方便。于是Android就通过引用计数来实现智能指针,并且实现有强指针和弱指针,对象本身提供计数器,但是对象不会维护引用计数器的值,而是由智能指针来管理。
需要实现这样的场景,可以定义一个公共类,来提供计数器,所有对象都去继承这个公共类,这样就可以实现所有对象都可以用引用计数来进行管理,在Android中,这个公共类就是RefBase类。
而具体的去操作引用计数的值的东西呢,又是两个智能指针,sp(Strong Point)和wp(Weak Point).
例子:
下面我们从一个例子上讲述智能指针的使用:
/类A从RefBase派生,RefBase是万物的始祖
class A:public RefBase // 见 ①
{
//A没有任何自己的功能
}
// 主函数
int main()
{
A* pA =new A; // 见②
{
//注意我们的sp,wp对象是在{}中创建的,下面的代码先创建sp,然后创建wp
sp<A>spA(A); // 见③
wp<A>wpA(spA); // 见 ④
//大括号结束前,先析构wp,再析构sp
}
}
1.类的声明
首先类A继承自refbase类,其实在正常的使用中,都是会使用virtual虚拟类来继承的,因为A不可能没有自己的方法。
经过这一步之后,我们就可以假定class A中已经存在了一个计数器了,具体的代码后面再分析。
2.创建对象
A* pA =new A;
这一步其实和之前类的声明相同,在创建真实对象A之后,pA指针所对应的对象中已经有了一个影子对象,而这个影子对象其实就是强弱引用的计数器,这个后面分析。
3.创建强引用
sp是一个模板类,而创建强引用的方式也有4种,而这种也只是其中一种。首先记得这个地方是创建了一个强引用,而强引用的作用就是将强引用计数和弱引用计数都+1.那么此时计数器就是s1,w1.具体的代码逻辑后面分析。
4.创建弱引用
wp同样是一个模板类,简述中我们说过sp和wp是用来对refbase的计数器进行操作的。那么就可以想到,wp就是弱引用计数+1,那么现在计数器就是s1,w2.
总结:
开篇只需要记得:refbase是公共类,里面保存了一个计数器,而sp和wp都是对计数器操作的方式,记着这样的操作,然后进入我们下一篇的分析。