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