- 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的指针。现在转去查看该成员函数的实现。??????
您可能关注的文档
最近下载
- Midea 美的 MB-WFZ4000XM-W电饭煲(锅) 说明书.pdf
- 上海电大-会计实验实训-形考册参考答案-完整版.pdf
- 约克风冷热泵机组样本-附件.pdf
- 惠州市城市环境卫生专项规划.doc VIP
- 20240121-东北证券-中际旭创-300308-全球光模块领先企业,AIGC“旭”光时代再“创”新征程.pdf
- 《聚合物制备工程》全套教学课件.pptx
- 2021年高考全国甲卷英语试题(含听力音频、听力原文和答案解析).pdf
- 肺癌中医护理方案.ppt VIP
- 【大单元整体教学】第二单元 成长的时空-2024-2025学年七年级道德与法治上册活动型同步教学设计(统编版).docx VIP
- 浙教版六年级上册信息科技第5课算法的执行(课件).pptx VIP
文档评论(0)