Android-RefBase&sp&wp

本贴最后更新于 3601 天前,其中的信息可能已经沧海桑田

最近在读 android 源码,学到不少有用的东西,写篇博文记录一下。

首先介绍一下 RefBase,sp,wp:

RefBase是所有对象的鼻祖类似于Java中的Object,它结合了sp和wp,实现了一套通过引用计数的方法来控制对象生命周期的机制。那么sp和wp分别是什么呢?网上有很多资料把他们解释为smart pointer,也就是智能指针,其实并不准确。其实sp就是strong pointer,wp则是weak pointer,分别叫做强指针和弱指针。下面通过源码来具体介绍一下:


RefBase::RefBase():mRefs(new weakref_impl(this)){}



这是RefBase的构造函数,它给成员变量mRefs赋值为weakref_impl类型对象,暂且把它叫做影子对象。


weakref_impl(RefBase* base):mStrong(INITIAL_STRONG_VALUE)//强引用计数,初始值0x1000000
                           ,mWeak(0) //弱引用计数,初始值0
                           ,mBase(base) //
                           ,mFlags(0)
                           ,mStringRefs(NULL)
                      {}


可以看到一个RefBase对象中包含了一个影子对象,影子对象里包含了强弱引用计数。下面看sp对象:


sp<T>::sp(T* other):m_ptr(other)
{
  if(other) other->incStrong(this);
}
sp对象需要用RefBase对象来初始化,所以other就是RefBase所代表的对象了。接着看RefBase类中的 incStrong函数。


void RefBase::incStrong(const void* id) const
{
  weakref_impl* const refs=mRefs;
  refs->addWeakRef(id);
  refs->incWeak(id);
  ......
  refs->addStrongRef(id);
  const int32_t c=android_atomic_inc(&refs->mStrong);//原子+1操作,返回旧值,即参数+1,返回+1前的值
  if(c!=INITIAL_STRONG_VALUE){
    return;
  }
  android_atomic_add(-INITIAL_STRONG_VALUE,&refs->mStrong);//原子加,参数相加
  const_cast<RefBase*>(this)->onFirstRef();
}


意图很明显,sp对象初始化后,影子对象的弱引用计数0+1=1,强引用计数变为1。

看完sp的构造之后,来看一下wp的构造


wp<T>::wp(const sp<T>& other):m_ptr(other.m_ptr)
{
  if(m_ptr){
    m_refs=m_ptr->createWeak(this);
  }
}


wp的用sp对象初始化,所以other是sp的对象,m_ptr指向的是实际对象。createWeak之后,跟刚才一样,弱引用计数+1,所以现在mWeak=2 mStrong=1。

下面看一下wp的析构函数


wp<T>::~wp()
{
  if(m_ptr) m_refs->decWeak(this);
}



调用的是RefBase对象的decWeak()函数。主要作用就是弱引用计数-1,即从2变成1。

接着sp的析构:



 if(m_ptr) m_ptr->decStrong(this);



这里把强引用计数和弱引用计数都变成0了。由于是否delete是根据强弱引用计数来判断的,所以实际对象和影子对象都被delete掉。强引用计数为0,实际对象被delete,弱引用计数为0,影子对象被delete。


这就是比较基本的RefBase、sp、wp的关系啦,其实对象的生命周期,还有其他的因素,不过都是围绕这三个对象和强弱引用计数来进行的。



  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖 • 3 关注
  • RefBase
    1 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 714593351

    哈哈,.top 域名啊,我那时候也注册了两个

  • wind
    作者

    @714593351 原来发布的博客会同步到社区里来==,今天第一次用呢。。。

推荐标签 标签

  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 394 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 254 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 28 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 799 关注
  • danl
    179 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 42 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 238 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    125 引用 • 74 回帖
  • sts
    2 引用 • 2 回帖 • 242 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    229 引用 • 476 回帖
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    373 引用 • 1858 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 53 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖 • 4 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖