android智能指针详解

android智能指针详解

ID:40524666

大小:135.00 KB

页数:11页

时间:2019-08-04

android智能指针详解_第1页
android智能指针详解_第2页
android智能指针详解_第3页
android智能指针详解_第4页
android智能指针详解_第5页
资源描述:

《android智能指针详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、研究Android的时候,经常会遇到sp、wp的东西,网上一搜,原来是android封装了c++中对象回收机制。说明:1.如果一个类想使用智能指针,那么必须满足下面两个条件:   a.该类是虚基类RefBase的子类或间接子类   b.该类必须定义虚构造函数。如virtual~MyClass();2.本文以类BBinder来进行说明,其余类使用sp或wp的情况类似3.代码路径:frameworks/base/libs/utils/RefBase.cpp      frameworks/base/include/utils/RefBase.h一、calssBBinder类说明  

2、   classRefBase     classIBinder classBpBinder  classBBinder classBBinder:publicIBinder { ... protected:    virtual            ~BBinder(); ... } classIBinder:publicvirtualRefBase { ... protected:    inlinevirtual     ~IBinder(){} ... } 由上,可以看出BBinder和IBinder都是以public的方式继承于虚基类RefBase的。二、spwp对

3、象的建立过程 解析:sp BB_ptr(newBBinder); 这是一条定义sp指针BB_ptr的语句,他只想的对象是一个BBinder对象。 如图所示。1》首先看一下newBBinder时都做了什么,特别是和该机制相关的初始化。  c++中创建一个对象时,需要调用去构造函数,对于继承类,则是先调用其父类的构造函数,然后才会调用本身的  构造函数。这里new一个BBinder对象时,顺序调用了:    RefBase::RefBase():mRefs(newweakref_impl(this)){}    inline  IBinder(){}    BBi

4、nder::BBinder():mExtras(NULL){}  主要关注的是RefBase的构造函数,  可以看出他是通过newweakref_impl(this)的结果来初始化私有成员mRefs  这里的this指向BBinder对象自身,classweakref_impl继承于类RefBase的内嵌类weakref_type,然后该类  weakref_impl又被类RefBase引用。类weakref_impl的构造函数如下:  weakref_impl(RefBase*base)       :mStrong(INITIAL_STRONG_VALUE)    //1<

5、<28       ,mWeak(0)       ,mBase(base)             //newBBinder指针       ,mFlags(0)       ,mStrongRefs(NULL)          //sp引用链表指针       ,mWeakRefs(NULL)           //wp引用链表指针       ,mTrackEnabled(!!DEBUG_REFS_ENABLED_BY_DEFAULT)//1       ,mRetain(false){}   2》newBBinder返回的是BBinder对象的指针,如:sp

6、nder> BB_ptr(0x????????);  sp实际上是一个类模板,这条语句最终是要建立一个sp的实例化对象,叫模板类BB_ptr  这里生成BB_ptr对象所调用的构造函数是:  template   sp::sp(T*other)      :m_ptr(other)   {      if(other)other->incStrong(this);   }   BB_ptr对象的私有指针指向刚刚前面生成的BBinder对象。   接着调用函数incStrong(),该函数是RefBase类的成员函数,在子类中没有被重载,所以这里   

7、other->incStrong(this)的调用实际上是调用基类成员函数incStrong(this),这个this值是指向sp对象   BB_ptr的指针。现在转去查看该成员函数的实现。      voidRefBase::incStrong(constvoid*id)const   {      weakref_impl*constrefs=mRefs;      /*取得BBinder对象基类中的私有只读指针mRefs*/      refs->addWeakRef(id);    

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。