软件编程
位置:首页>> 软件编程>> Android编程>> 一文理解Android系统中强指针的实现

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

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

标签:Android,强指针,智能指针

强指针和弱指针基础

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com