首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似
这个类中存在一个私有成员:
weakref_impl* const mRefs;(weakref_impl是weakref_type的子类)
这个mRefs是“影子对象”,是管理一个对象的引用计数的关键
RefBase的构造中mRefs(new weakref_impl(this)),new一个weakref_impl对象,weakref_impl的构造形参是RefBase的指针
同时会初始化weakref_impl的mStrong和mWeak这两个成员,这两个就是关键的强引用计数和弱引用计数
/********************RefBase的使用和原理其实很简单*****************************/
 
接下来看看sp和wp(4.4及更高版本的源码中,sp不在RefBase中了,是放在StrongPointer的文件中)
wp:
template<typename T>
wp<T>::wp(T* other)
    : m_ptr(other) //wp<A>中使用m_ptr指向实际的对象
{
    if (other) m_refs = other->createWeak(this); //m_ref是一个RefBase中的weakref_type的对象,可以看出是将实际对象的影子对象加工处理之后再传给wp的成员的,也就是说wp握有一个实际对象的影子对象
}
wp是一个模板类,wp<A> wpA(pA);当然其构造函数有很多还可以用sp<A>来构造
 other->createWeak(this);会调到RefBase的createWeak,然后调用影子对象mRefs的增加弱引用计数
wp的析构函数:
template<typename T>
wp<T>::~wp()
{
    if (m_ptr) m_refs->decWeak(this);
}
在wp析构的过程中,回去调用实际对象的影子对象的弱引用自减,自减过后,弱引用会判断当前的引用计数,如果为0,则调用自身的析构,释放内存
 
sp与wp类似
但是sp内部仅有指向实际对象的指针的成员(但有指向实际对象的指针也能够找到影子对象)
构造过程中会找到实际对象的影子对象,然后将影子对象的强引用和弱引用都自加
然后值析构的过程中分两步走:
1.首先减少影子对象的强引用计数,这时判断如果强引用计数为0的话则析构实际数据本身
2.再减少影子对象的弱引用计数,然后但弱引用计数为0的话就将影子对象释放
 
这种弱指针和强指针在android系统中起到的作用:就是用这个代替传统的指针,让代码中自行管理对象的内存释放,避免人工造成的内存泄露
项目中用过
pA = new A();
sp<A> spA = pA;
sp<A> spA(pA);
这里就重载了等号操作符
重载操作符是为了让这些操作符更加适用于更多的类类型
template<typename T>
sp<T>& sp<T>::operator = (T* other)
{
    if (other) other->incStrong(this); //this的含义是类中函数的一个隐含参数,指向该类本身,这里就是指向sp<T>
    if (m_ptr) m_ptr->decStrong(this); //空构造mptr初始化0
    m_ptr = other;
    return *this;
}

android RefBase、sp、wp的更多相关文章

  1. Android 内核初识(7)RefBase、LightRefBase、sp和wp

    简介 RefBase是Android中所有对象的始祖,类似MFC中的CObject及Java中的Object对象.在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对 ...

  2. 屏幕适配基础——了解:ppi、dpi、px、sp、dp

    做android开发绕不开的几个名词:ppi.dpi.px.sp.dp.那么它们的定义.区别和联系都是什么呢?这篇博客系统的做一个概述和总结. 1.基本概念 px:pixel,像素,电子屏幕上组成一幅 ...

  3. Android中的sp和wp指针

    经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下 ...

  4. Android中dip、dp、sp、pt和px的区别

    1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小.在有些情况 ...

  5. px、dp、sp、mm、in、pt这些单位有什么区别?

    相信每个Android新手都会遇到这个问题,希望这篇帖子能让你不再纠结. px: 即像素,1px代表屏幕上一个物理的像素点: px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小 ...

  6. android学习笔记18——dpi、dp、sp、xp......

    参考:http://www.cnblogs.com/greatverve/archive/2011/12/28/android-dip-dp-sp-pt-px.html  http://www.360 ...

  7. Android长度单位详解(dp、sp、px、in、pt、mm、dip)

    Android中定义的dimension单位有以下这些:px(Pixels ,像素):对应屏幕上的实际像素点.in(Inches ,英寸):屏幕物理长度单位.mm(Millimeters ,毫米):屏 ...

  8. Android px、sp、dp之间的互转

    public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResourc ...

  9. Android中的sp与wp

    一.相关code文件 二.code具体分析 lightrefebase: refbase: sp: wp: flag: 三.使用注意事项 不能在把目标对象赋给一个长久存在的sp对象之前赋给一个短生命周 ...

随机推荐

  1. .Net Core中的配置文件源码解析

    一.配置简述 之前在.Net Framework平台开发时,一般配置文件都是xml格式的Web.config,而需要配置其他格式的文件就需要自己去读取内容,加载配置了..而Net Core支持从命令行 ...

  2. bzoj 1835/luogu P2605 : [ZJOI2010]base 基站选址

    题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ...

  3. VS2015中跑OpenGL红宝书第八版的示例代码

    OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资料终于跑起来了,记录一下 一.环境 ...

  4. clipRect 介绍

    clipRect 介绍 博客分类: android   android的clip有以下两点疑问: Clip(剪切)的时机 Clip中的Op的参数的意思.   通常咱们理解的clip(剪切),是对已经存 ...

  5. VC 读取服务器上的文件(HTTP方式) [转]

    CString GetStringFromUrl(LPCTSTR pszUrl){    CString str ;    HINTERNET hSession = ::InternetOpen( _ ...

  6. mysql序列号发生器

    mysql序列号发生器 学习了:http://www.jquerycn.cn/a_14577 还可以这样啊:

  7. 转:android studio入门合集

    http://blog.csdn.net/column/details/zsl-androidstudio.html

  8. redis 3.0.1 在CentOS上的安装

    一.下载 wget http://download.redis.io/releases/redis-3.0.1.tar.gz 二.解压 tar xzf redis-3.0.1.tar.gz 三.进入 ...

  9. 【每日Scrum】第三天(4.13) TD学生助手Sprint1站立会议

    TD学生助手Sprint1站立会议(4.13) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天完成了课程的增删改查功能 今天早晨静姐调整了下界面和配色,下午和宝月兄一起做 ...

  10. 笔记08 throw e 和throw 的区别

    throw e对原异常进行拷贝,然后将新的异常对象抛出,这一步拷贝就有可能导致错误啦,拷贝出来的异常对象可能和原来的异常对象不是一个类型. 比如原来的对象是个子类的异常对象,catch里声明的是父类异 ...