Android指针管理:RefBase SP WP.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android指针管理:RefBase SP WP

Android中通过引用计数来实现智能指针,并且实现有强指针与弱指针。由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理。要达到所有对象都可用引用计数器实现智能指针管理的目标,可以定义一个公共类,提供引用计数的方法,所有对象都去继承这个公共类,这样就可以实现所有对象都可以用引用计数来管理的目标,在Android中,这个公共类就是RefBase,同时还有一个简单版本LightRefBase。RefBase作为公共基类提供了引用计数的方法,但是并不去维护引用计数的值,而是由两个智能指针来进行管理:sp(Strong?Pointer)和wp(Weak?Pointer),代表强引用计数和弱引用计数。?一、轻量级引用计数的实现:LightRefBaseLightRefBase的实现很简单,只是内部保存了一个变量用于保存对象被引用的次数,并提供了两个函数用于增加或减少引用计数。template class TclassLightRefBase{public:inlineLightRefBase() : mCount(0) { }inlinevoidincStrong(constvoid* id) const {android_atomic_inc(mCount); }inlinevoiddecStrong(constvoid* id) const {if (android_atomic_dec(mCount) == 1) {deletestatic_castconst T*(this); } }//! DEBUGGING ONLY: Get current strong ref count.inline int32_t getStrongCount() const {returnmCount; }typedefLightRefBaseT basetype;protected:inline ~LightRefBase() { }private:mutablevolatile int32_t mCount;};二、sp(Strong?Pointer)LightRefBase仅仅提供了引用计数的方法,具体引用数应该怎么管理,就要通过智能指针类来管理了,每当有一个智能指针指向对象时,对象的引用计数要加1,当一个智能指针取消指向对象时,对象的引用计数要减1,在C++中,当一个对象生成和销毁时会自动调用(拷贝)构造函数和析构函数,所以,对对象引用数的管理就可以放到智能指针的(拷贝)构造函数和析构函数中。Android提供了一个智能指针可以配合LightRefBase使用:sp,sp的定义如下:template typename Tclasssp{public:inlinesp() : m_ptr(0) { }sp(T* other);sp(constspT other);templatetypename U sp(U* other);templatetypename U sp(constspU other); ~sp();// Assignmentsp operator = (T* other);sp operator = (constspT other);templatetypename U sp operator = (constspU other);templatetypename U sp operator = (U* other);//! Special optimization for use by ProcessState (and nobody else).voidforce_set(T* other);// Resetvoid clear();// Accessorsinline T operator* () const { return *m_ptr; }inline T* operator- () const { returnm_ptr; }inline T* get() const { returnm_ptr; }// OperatorsCOMPARE(==)COMPARE(!=)COMPARE()COMPARE()COMPARE(=)COMPARE(=)private: templatetypename Y friend classsp;templatetypename Y friend classwp;voidset_pointer(T* ptr); T* m_ptr;};代码比较多,其中Accessors部分代码重载了*、-操作符使我们使用sp的时候就像使用真实的对象指针一样,可以直接操作

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档