自己学习记录使用
引用计数原则,每当有一个指针指向了一个new出来的对象时,就对这个对象的引用计数增加1,每当有一个指针不再使用这个对象时,就对这个对象的引用计数减少1,每次减1之后,如果发现引用计数值为0时,那么,就要delete这个对象了
对象的引用计数同时存在强引用和弱引用两种计数,
- 当父对象要引用子对象时,就对子对象使用强引用计数技术
- 当子对象要引用父对象时,就对父对象使用弱引用计数技术
垃圾收集系统执行对象回收工作时,只要发现对象的强引用计数为0,而不管它的弱引用计数是否为0,都可以回收这个对象,如果我们只对一个对象持有弱引用计数,当我们要使用这个对象时,就不直接使用了,必须要把这个弱引用升级成为强引用时,才能使用这个对象,在转换的过程中,如果对象已经不存在,那么转换就失败了,这时候就说明这个对象已经被销毁了,不能再使用了。
Android系统提供的三种智能指针分别就称为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Weak Pointer)
智能指针类
1. 轻量级指针
LightRefBase:位置在frameworks/base/include/utils/RefBase.h
template <class T>
class LightRefBase
{
public:
inline LightRefBase() : mCount(0) {}
inline void incStrong(const void* id) const {
android _atomic_inc(&mCount);
}
inline void decStrong(const void* id) const {
if (android_atomic_dec(&mCount) == 1){
delete static_cast<const T*>(this);
}
}
//! DEBUGGING ONLY: Get current strong ref count.
inline int32_t getStrongCount() const {
return mCount;
}
protected:
inline ~LightRefBase() { }
private:
mutable volatile int32_t mCount; // 引用计数器了
}
成员变量mCount,引用计数器
成员函数incStrong和decStrong来维护引用计数器的值,这两个函数就是提供给智能指针来调用的了,这里要注意的是,在decStrong函数中,如果当前引用计数值为1,那么当减1后就会变成0,于是就会delete这个对象。
原文链接:https://blog.csdn.net/luoshengyang/article/details/6786239