Android-RefBase&sp&wp

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

最近在读 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 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 25 关注
  • RefBase
    1 引用 • 2 回帖

相关帖子

欢迎来到这里!

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

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

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

  • wind
    作者

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

推荐标签 标签

  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 16 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 702 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 45 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖 • 3 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 497 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 706 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 355 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖 • 2 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 733 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 32 关注
  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 646 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 313 关注
  • 尊园地产

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

    1 引用 • 22 回帖 • 703 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 25 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 683 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 456 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 50 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 202 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖