告诉你可能不知道的秘密之Android轻量级引用LightRefBase

来源:互联网 发布:重庆数控编程培训 编辑:程序博客网 时间:2024/06/02 09:27

Google工程师之所以称其为轻量级引用,不仅仅是因为轻量级引用不涉及弱引用技术。

轻的额外三点:


1.轻量级引用轻在功能,采用模板技术,模板里有关于指针类型转换的代码,LightBaseRef<MyClass>必须作为MyClass的基类才能完成转换,仅仅为MyClass类型及其派生类型对象提供引用计数功能!总而言之,不同类继承体系拥有不同的引用技术基类。

2.轻量级引用轻在机制,正如上一点所言,采用模板机制,而不是复杂的OOP机制,所以轻量级引用不涉及菱形缺陷,无需使用虚继承!

3.轻量级引用基类轻在内存,只拥有一个成员变量,用以计数。其引用计数类模板不含有虚函数,如果尾端类(不被其他类继承的类)直接继承引用计数基类,那尾端类也不需要虚的析构函数,不会出现因部分删除而产生内存泄露,因为模板类代码中有一处使用static_cast向下转型,模板确保其安全。

android的智能指针,只负责调用 引用类的dec/inc方法,不负责删除工作。具体删除工作有引用基类LightRefBase和RefBase负责

RefBase持有弱引用,持有指针,在进行删除工作时较为复杂。

总之,轻量级引用,功能简单,不涉及虚继承,一般不需要虚函数。

轻量级引用的缺陷:

1.不支持弱引用。

2.轻量级引用类,使用模版技术,所以模版技术的缺陷,轻量级引用亦有,很明显一点就是你会需要很多不同轻量级引用类。

3.编译级别支持引用栈对象,运行时会崩溃,Scott Meyers说过只要编译器允许,就一定有人这么干。此问题需要使用者解决-----利用protected dector 和  friend class  refbase


本文乃我学习时,自己总结,如果有错误请多多指教。

0 0