首先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. Codeforces Gym101502 H.Eyad and Math-换底公式

    H. Eyad and Math   time limit per test 2.0 s memory limit per test 256 MB input standard input outpu ...

  2. SPOJ LIS2 - Another Longest Increasing Subsequence Problem(CDQ分治优化DP)

    题目链接  LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #i ...

  3. UVA - 10615 Rooks

    建一下模,把行和列看成二分图的点,把车看成是二分图中的边,这样就变成了上一个博客的问题. 我们每次新加一条边,就把它加入一条 这条边两端点最小没有出现的颜色  交替出现的路径中去. #include& ...

  4. 深入理解Atomic原子类

    Atomic是基于unsafe类和自旋操作实现的,下面以AtomicInteger类为例进行讲解. 要理解Atomic得先了解CAS CAS CAS全程Compare And Swap ,是条并发原语 ...

  5. Android中Drawable知识总结

    本文是学习<Android开发艺术探索>中Drawable章节之后的一个总结. 一.常见的Drawable种类介绍 Drawable类 xml标签 描述 BitmapDrawable 表示 ...

  6. Unity -- 入门教程一

    首先声明一下,我用的Unity版本是4.6.6,编译环境是VS2010,其余的我会慢慢介绍,安装的过程这里我就不做讲解了,度娘那会做的比我详细.安装包可以在最下面的联系方式找我要,现在开始进入主题.  ...

  7. UITableViewCell -- 动画

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath: ...

  8. Nutch学习笔记一 ---环境搭建

    学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika ...

  9. The bean 'xxx' could not be injected as a 'xxx'because it is a JDK dynamic proxy that implements

    启动springboot项目的时候示以下错误 Error starting ApplicationContext. To display the conditions report re-run yo ...

  10. discuz X3.1+Apache2.2+php-5.2.17+mysql5.6.14+Discuz_X3.1

    discuz X3.1+Apache2.2.25+php-5.2.17+mysql5.6.14+Discuz_X3.1 一.准备 1.httpd-2.2.25-win32-x86-no_ssl.msi ...