- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
android智能指针详解
研究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
一、calss BBinder类说明????? class RefBase????? class IBinder?class BpBinder?? class BBinder?class BBinder : public IBinder?{?...?protected:???? virtual???????????? ~BBinder();?...?}?class IBinder : public virtual RefBase?{?...?protected:???? inline virtual????? ~IBinder() { }?...?}?由上,可以看出BBinder和IBinder都是以public的方式继承于虚基类RefBase的。
二、sp wp对象的建立过程?解析:spBBinder? BB_ptr(new BBinder);?这是一条定义sp指针BB_ptr的语句,他只想的对象是一个BBinder对象。?如图所示。
1》首先看一下new BBinder时都做了什么,特别是和该机制相关的初始化。?? c++中创建一个对象时,需要调用去构造函数,对于继承类,则是先调用其父类的构造函数,然后才会调用本身的?? 构造函数。这里new一个BBinder对象时,顺序调用了:????RefBase::RefBase() : mRefs(new weakref_impl(this)) {}????inline?? IBinder() {}????BBinder::BBinder() : mExtras(NULL){}?? 主要关注的是RefBase的构造函数,?? 可以看出他是通过new weakref_impl(this)的结果来初始化私有成员mRefs?? 这里的this指向BBinder对象自身,class weakref_impl继承于类RefBase的内嵌类weakref_type,然后该类?? weakref_impl又被类RefBase引用。类weakref_impl的构造函数如下:?? weakref_impl(RefBase* base)??????? : mStrong(INITIAL_STRONG_VALUE)????// 1 28??????? , mWeak(0)??????? , mBase(base)?????????????// new BBinder指针??????? , mFlags(0)??????? , mStrongRefs(NULL)??????????// sp引用链表指针??????? , mWeakRefs(NULL)???????????// wp引用链表指针??????? , mTrackEnabled(!!DEBUG_REFS_ENABLED_BY_DEFAULT) // 1??????? , mRetain(false) {}?? ?2》new BBinder返回的是BBinder对象的指针,如:spBBinder? BB_ptr(0x????????);?? sp实际上是一个类模板,这条语句最终是要建立一个sp的实例化对象,叫模板类BB_ptr?? 这里生成BB_ptr对象所调用的构造函数是:?? templatetypename T???spT::sp(T* other)?????? : m_ptr(other)???{?????? if (other) other-incStrong(this);???}???BB_ptr对象的私有指针指向刚刚前面生成的BBinder对象。???接着调用函数incStrong(),该函数是RefBase类的成员函数,在子类中没有被重载,所以这里???other-incStrong(this)的调用实际上是调用基类成员函数incStrong(this),这个this值是指向sp对象???BB_ptr的指针。现在转去查看该成员函数的实现。??????
文档评论(0)