一文理解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