Android系统轻量级指针、强指针和弱指针

自己学习记录使用

引用计数原则,每当有一个指针指向了一个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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容