AndroidC++回收机制19.docVIP

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

Android C++回收机制 1关于C++ Layer的内存回收机制 Android C++层的内存收回主要是通过三个类来实现,分别是RefBase,sp,wp; SP和WP是两个智能指针模板类,sp是strong pointer,wp则是weak pointer,亦我们常说的强引用和弱引用;实例化sp和wp这两个模板类的类型必须是派生自RefBase的类 1.1 RefBase类 因为这个类拥有对内存回收机制的默认实现,所以android上想要支持内存回收机制的类必须派生自RefBase 下面简单介绍下成员变量和成员函数: mRefs: weakref_impl对象,派生于RefBase::weakref_type, 包含了对strong ref和weak ref的具体实现,也就是说RefBase中只包含了一些对外的标准操作,具体的实现在weakref_impl内 void incStrong(const void *id): 强引用计数加1,参数id主要用在debug时跟踪调试,一般都为sp或者wp的对象指针 void decStrong(const void *id): 强引用计数减1,参数id含义同上 void forceIncStrong(const void *id): 强制引用计数加1 Int32_t getStrongCount(): 获去强引用计数值 weakref_type * createWeak(const void *id) 弱引用计数加1,然后返回weakref_impl对象 weakref_type* getWeakRefs() 获取weakref_impl对象 void extendObjectLifetime(int32_t mode): 扩展对象的生命期,默认为0,可设置为 OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_FOREVER = 0x0003 这几个参数的作用在下面会详细描述 virtual void onFirstRef() 虚函数,在第一次新增引用计数时,会调用此函数,接下去的其他函数都类似 上面也有提到了,RefBase有一个内部基类weakref_type, 它主要包含了对弱引用计数的基本操作, void incWeak(const void*id): 弱引用计数加1,id参数的意义同上 void decWeak(const void *id): 弱引用计数减1,id同上 bool attemptIncStrong(const void *id): 尝试增加强引用计数,这个函数会在wp promote获取sp时被调用,主要确认wp promote为sp是否成功 bool attemptIncWeak(const void *id): 尝试增加弱引用计数,这个功能只在object lifetime设置为OBJECT_LIFETIME_FOREVER有效 Int32_t getWeakCount(): 获取弱引用计数值 在RefBase中,可以通过extendObjectLifetime来设置lifetime,有三种life time: 1:default(0),强引用和弱引用的默认行为,不管弱应用计数的值为多少,只要强引用计数的值为0,就释放对象 2:OBJECT_LIFETIME_WEAK,在这种状态下,如果强引用为0时,对象不会被释放,只有在弱引用计数为0的情况下,对象才会被释放 3:OBJECT_LIFETIME_WEAK | OBJECT_LIFETIME_FOREVER,在这种状态下,对象永不会释放 第三种情况比较猛,设置了,除非主动delete raw pointer,否则在sp和wp的规则下,是不会被释放的,当然,promote也是永远都会成功的 在增加或者减少强引用计数的同时,弱引用计数也会被增加或减少,它们总是配对出现的,下面简单看下几个关键部分的代码: //增加强引用计数 void RefBase::incStrong(const void* id) const { weakref_impl* const refs = mRefs; //store the object which makes strong reference up, just for track debug, it is an empty //function refs-addWeakRef(id); //increment weak reference refs-incWeak(id); //store the object which makes strong reference up, just for track debug,

文档评论(0)

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

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

1亿VIP精品文档

相关文档