一文理解Android系统中强指针的实现

作者:小道安全 时间:2022-03-11 11:37:02 

强指针和弱指针基础

android中的智能指针包括:轻量级指针、强指针、弱指针。
强指针:它主要是通过强引用计数来进行维护对象的生命周期。
弱指针:它主要是通过弱引用计数来进行维护所指向对象的生命周期。
如果在一个类中使用了强指针或者弱指针的技术,那么这个类就必须从RefBase这个类进行做继承,因为强指针和弱指针是通过RefBase这个类来提供实现的引用计数器。
强指针和弱指针关系相对于轻量级指针来说更加亲密,因此他们一般是相互配合使用的。

强指针原理分析

以下针对源码的分析都是来源于android5.0系统源码
强指针的定义实现主要在\frameworks\rs\cpp\util\RefBase.h文件中


class RefBase
{
public:
           //定义了成员变量用于维护强引用对象的引用计数
           void            incStrong(const void* id) const;
           //定义了成员变量用于维护强引用对象的引用计数
           void            decStrong(const void* id) const;

void            forceIncStrong(const void* id) const;

//获取强指针计数的数量.
           int32_t         getStrongCount() const;
   //这个类主要实现计数器的
   class weakref_type
   {
   public:
       RefBase*            refBase() const;

void                incWeak(const void* id);
       void                decWeak(const void* id);

// acquires a strong reference if there is already one.
       bool                attemptIncStrong(const void* id);

// acquires a weak reference if there is already one.
       // This is not always safe. see ProcessState.cpp and BpBinder.cpp
       // for proper use.
       bool                attemptIncWeak(const void* id);

//! DEBUGGING ONLY: Get current weak ref count.
       int32_t             getWeakCount() const;

//! DEBUGGING ONLY: Print references held on object.
       void                printRefs() const;

//! DEBUGGING ONLY: Enable tracking for this object.
       // enable -- enable/disable tracking
       // retain -- when tracking is enable, if true, then we save a stack trace
       //           for each reference and dereference; when retain == false, we
       //           match up references and dereferences and keep only the
       //           outstanding ones.

void                trackMe(bool enable, bool retain);
   };

weakref_type*   createWeak(const void* id) const;

weakref_type*   getWeakRefs() const;

//! DEBUGGING ONLY: Print references held on object.
   inline  void            printRefs() const { getWeakRefs()->printRefs(); }

//! DEBUGGING ONLY: Enable tracking of object.
   inline  void            trackMe(bool enable, bool retain)
   {
       getWeakRefs()->trackMe(enable, retain);
   }

typedef RefBase basetype;

protected:
                           RefBase();
   virtual                 ~RefBase();

//! Flags for extendObjectLifetime()
   enum {
       OBJECT_LIFETIME_STRONG  = 0x0000,
       OBJECT_LIFETIME_WEAK    = 0x0001,
       OBJECT_LIFETIME_MASK    = 0x0001
   };

void            extendObjectLifetime(int32_t mode);

//! Flags for onIncStrongAttempted()
   enum {
       FIRST_INC_STRONG = 0x0001
   };

virtual void            onFirstRef();
   virtual void            onLastStrongRef(const void* id);
   virtual bool            onIncStrongAttempted(uint32_t flags, const void* id);
   virtual void            onLastWeakRef(const void* id);

private:
   friend class ReferenceMover;
   static void moveReferences(void* d, void const* s, size_t n,
           const ReferenceConverterBase& caster);

private:
   friend class weakref_type;
   //通过类对象来获取计数器数据。
   class weakref_impl;

RefBase(const RefBase& o);
           RefBase&        operator=(const RefBase& o);

weakref_impl* const mRefs;
};

通过以上类定义可以看到 RefBase类里面嵌套着weakref_type类,这个weakref_type类也的对象mRefs来描述对象的引用计数。也就是说每一个RefBase对象都包含一个weakref_type对象。
virtual表示的是虚函数,friend表示友元函数,

来源:https://blog.csdn.net/c_kongfei/article/details/120631334?utm_medium=distribute.pc_category.none-task-blog-hot-10.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-10.nonecase

标签:Android,强指针,智能指针
0
投稿

猜你喜欢

  • 基于C#实现一个简单的FTP操作工具

    2023-05-12 11:50:58
  • Spring Boot中操作使用Redis实现详解

    2023-11-24 02:39:29
  • WPF如何自定义ProgressBar滚动条样式

    2021-08-02 13:31:44
  • 一篇文章带你了解XGBoost算法

    2021-10-10 01:14:45
  • Java线程安全问题小结_动力节点Java学院整理

    2021-09-25 21:01:43
  • 详解Android Studio安装ButterKnife插件(手动安装)

    2023-07-06 13:59:32
  • Java实现将txt文件转成xls文件的方法

    2022-05-20 10:21:25
  • 微信公众号支付(二)实现统一下单接口

    2023-01-12 21:29:18
  • Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    2022-03-21 05:25:23
  • C#自定义缓存封装类实例

    2023-10-15 09:24:27
  • Android自定义View实现闪耀字体效果

    2023-05-10 02:27:43
  • JavaWeb简单文件上传流程的实战记录

    2023-04-02 09:14:59
  • C++中静态成员函数与静态成员变量(static )

    2021-11-08 07:31:38
  • Spring boot集成swagger2生成接口文档的全过程

    2021-07-29 14:28:07
  • MyBatis官方代码生成工具给力(解放双手)

    2023-12-14 17:01:17
  • C# SendInput 模拟鼠标操作的实现方法

    2022-03-15 00:07:25
  • WPF Slider滑动条的颜色修改方法

    2022-06-15 20:49:38
  • C#在图片增加文字的实现代码

    2023-03-30 03:26:24
  • springboot @ConfigurationProperties和@PropertySource的区别

    2023-06-12 07:18:14
  • SpringBoot实现简单文件上传功能

    2021-07-22 21:52:49
  • asp之家 软件编程 m.aspxhome.com