欢迎来到天天文库
浏览记录
ID:40524666
大小:135.00 KB
页数:11页
时间:2019-08-04
《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对象的指针,如:sp6、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);
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);
此文档下载收益归作者所有