首先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. est6 -- Object.is()、Object.assign()、Object.defineProperty()、Symbol、Proxy

    Object.is()用来比较两个值是否严格相等.它与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身. + === - //true NaN === ...

  2. Codeforces 798D Mike and distribution(贪心或随机化)

    题目链接 Mike and distribution 题目意思很简单,给出$a_{i}$和$b_{i}$,我们需要在这$n$个数中挑选最多$n/2+1$个,使得挑选出来的 $p_{1}$,$p_{2} ...

  3. Classical method of machine learning

    PCA principal components analysis kmeans bayes spectral clustering svm EM hidden Markov models deep ...

  4. [反汇编练习] 160个CrackMe之035

    [反汇编练习] 160个CrackMe之035. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. Redis及其Sentinel配置项详细说明

    Redis及其Sentinel配置项详细说明 http://lixiaohui.iteye.com/blog/2315516

  6. eclipse中文凝视字体太小解决方法

    新安装的eclipse中文凝视字体太小.解决方法例如以下: 打开Elcipse-->点击菜单条上的"Windows"-->点击"Preferences&quo ...

  7. Windows 无法卸载IE9怎么办

    1 如下图所示,使用自带的卸载工具无法卸载IE9 运行命令提示符,粘贴下面的命令 FORFILES /P %WINDIR%\servicing\Packages /M Microsoft-Window ...

  8. Quality control

    定义测试         为测试添加测试项     测试项目按类型分2种 Qualitative 定性,描述类的,比如颜色,是,否 Quantitative 定量,有明确的衡量         定性 ...

  9. c++对象内存模型【内存布局】(转)

    总结:1.按1继承顺序先排布基于每个父类结构.2.该结构包括:基于该父类的虚表.该父类的虚基类表.父类的父类的成员变量.父类的成员变量.3.多重继承且连续继承时,虚函数表按继承顺序排布函数与虚函数.4 ...

  10. shell(1):网络配置、BATH环境和通配符

    一.临时配置网络(ip,网关,dns) ifconfig查看网络配置 修改ip地址  ifconfig ens33 192.168.255.129/24 ens33网卡名称.192.168.255.1 ...