首先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. MySQL的一个麻烦事

    1. 开启一个MySQL连接,在这个连接中发起一个事务,进行一些操作但不提交 2. 拔网线 3. 重连网线,再开启一个MySQL连接,执行delete操作,发现stpe 1中占用的资源没有被释放 4. ...

  2. (42)C#Stopwatch类(计算程序运行时间)

    引入命名空间 using System.Diagnostics; static void Main(string[] args) { Stopwatch sw = new Stopwatch(); s ...

  3. HDU 1969 Pie【二分】

    [分析] “虽然不是求什么最大的最小值(或者反过来)什么的……但还是可以用二分的,因为之前就做过一道小数型二分题(下面等会讲) 考虑二分面积,下界L=0,上界R=∑ni=1nπ∗ri2.对于一个中值x ...

  4. 洛谷—— P2117 小Z的矩阵

    https://www.luogu.org/problemnew/show/2117 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1 ...

  5. 洛谷—— P1440 求m区间内的最小值

    https://www.luogu.org/problemnew/show/P1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的 ...

  6. JNA 相关问题

    JNA 相关问题 结构体对齐问题 要注意调用的c库字段对齐方式的相关设置. #pragma pack (push,1) #pragma pack(pop) jna中提供了4种对齐方式: /** Use ...

  7. PyTorch学习笔记之n-gram模型实现

    import torch import torch.nn as nn from torch.autograd import Variable import torch.nn.functional as ...

  8. .net 哈希

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  9. bootstrap-datetimepicker时间控件的使用

    官方文档:http://www.bootcss.com/p/bootstrap-datetimepicker/demo.htm 常规使用: <div class="input-grou ...

  10. 如何把网页或html内容生成图片

    网页或html内容生成图片 今天想把做好的html内容或网页生成一张图片,没有网页在线版的生成或转换工具,除非下载客户端软件使用.   不过,发现可以利用搜狗高速浏览器和360浏览器生成图片,这里讲解 ...