- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android指针管理:RefBase,SP,WP
ndroid中通过引用计数来实现智能指针,并且实现有强指针与弱指针。由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理。要达到所有对象都可用引用计数器实现智能指针管理的目标,可以定义一个公共类,提供引用计数的方法,所有对象都去继承这个公共类,这样就可以实现所有对象都可以用引用计数来管理的目标,在Android中,这个公共类就是RefBase,同时还有一个简单版本LightRefBase。RefBase作为公共基类提供了引用计数的方法,但是并不去维护引用计数的值,而是由两个智能指针来进行管理:sp(Strong?Pointer)和wp(Weak?Pointer),代表强引用计数和弱引用计数。?一、轻量级引用计数的实现:LightRefBaseLightRefBase的实现很简单,只是内部保存了一个变量用于保存对象被引用的次数,并提供了两个函数用于增加或减少引用计数。template class Tclass LightRefBase{public:inline LightRefBase() : mCount(0) { }inlinevoid incStrong(constvoid* id) const { android_atomic_inc(mCount); }inlinevoid decStrong(constvoid* id) const {if (android_atomic_dec(mCount) == 1) {delete static_castconst T*(this); } }//! DEBUGGING ONLY: Get current strong ref count.inline int32_t getStrongCount() const {return mCount; }typedef LightRefBaseT basetype;protected:inline ~LightRefBase() { }private:mutablevolatile int32_t mCount;};二、sp(Strong?Pointer)LightRefBase仅仅提供了引用计数的方法,具体引用数应该怎么管理,就要通过智能指针类来管理了,每当有一个智能指针指向对象时,对象的引用计数要加1,当一个智能指针取消指向对象时,对象的引用计数要减1,在C++中,当一个对象生成和销毁时会自动调用(拷贝)构造函数和析构函数,所以,对对象引用数的管理就可以放到智能指针的(拷贝)构造函数和析构函数中。Android提供了一个智能指针可以配合LightRefBase使用:sp,sp的定义如下:?template typename Tclass sp{public:inline sp() : m_ptr(0) { }sp(T* other);sp(const spT other);templatetypename U sp(U* other);templatetypename U sp(const spU other); ~sp();// Assignmentsp operator = (T* other);sp operator = (const spT other);templatetypename U sp operator = (const spU other);templatetypename U sp operator = (U* other);//! Special optimization for use by ProcessState (and nobody else).void force_set(T* other);// Resetvoid clear();// Accessorsinline T operator* () const { return *m_ptr; }inline T* operator- () const { return m_ptr; }inline T* get() const { return m_ptr; }// OperatorsCOMPARE(==)COMPARE(!=)COMPARE()COMPARE()COMPARE(=)COMPARE(=)private: templatetypename Y friend class sp;templatetypename Y friend class wp;void set_pointer(T* ptr); T* m_ptr;};代码比较多,其中Accessors部分代码重载了*、-操作符使我们
您可能关注的文档
- analogy类比.ppt
- Analysis-of-Wild-Honey-Suckle-诗歌-野金银花分析.ppt
- and5.1PowerManagerService深入分析(三)updatePowerStateLocked函数.doc
- ANDREW 智能天线.ppt
- android AlarmManager 研究.docx
- Android 4.2 由Context引发的思考.docx
- Android Activity的启动过程.doc
- Android Device Administration 设备管理器——实现一键锁屏.doc
- Android RecyclerView工作原理分析.doc
- Android Service的启动过程.doc
文档评论(0)