android智能指针详解.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档