android的智能指针

来源:互联网 发布:繁体字转换软件 编辑:程序博客网 时间:2024/05/21 21:52

android的应用程序框架层大多使用C++开发,为了解决C++指针易出错的问题,android提供了C++智能指针。

通常我们使用引用计数计数来维护对象的声明周期,对象引用计数计数的核心问题在于谁来维护对象的引用计数。手动维护方式显然不可取,智能指针提供了一种自动维护对象引用计数的计数。要强调的是智能指针不是一个指针,但是它引用了一个实际使用的对象,作为对象它能够自动地维护世纪对象的引用计数。

由于垃圾回收系统一次只能收集一个对象占用的内存,简单的引用计数计数面对对象间相互引用的问题时,显得无能为力。android里的只能指针采用了一种稍微复杂的引用计数计数来维护对象的声明周期,这种引用计数计数将对用的引用计数分为强引用计数和弱引用计数。对象的生命周期只受强引用计数的控制。一般情况下将由关联的对象划分为“父-子“和“子-父”关系。父对象通过强引用计数来引用子对象,子对象通过弱引用计数来引用父对象。这样就可以解决犹豫相互引用而不能释放的问题了。这也产生了一个新的问题,由于对象的生命周期不收弱引用计数控制,当子对象要使用父对象时,父对象有可能已经释放了,之歌时候就需要先将父对象的弱引用计数升级为强引用计数,然后才可以使用父对象。

android系统提供了三种类型的智能指针,分别是:轻量级指针,强指针,弱指针。轻量级指针使用了简单的引用计数计数,强指针和弱指针使用了强引用计数和弱引用计数技术。他们的原理都是类似的,即需要对象提供引用计数器,但是由只能指针来负责维护这个引用计数器。android中所有支持只能指针的对象类都必须从引用计数器这个公共类继承下来。

1.轻量级指针

轻量级指针必须从LigjtRefBase类继承下来,该类提供了一个简单的引用计数器。在LightRefBase类的成员函数decStrong中,如果对象的引用计数值在减少后变为0,就表示需要释放这个对象占用的内存。

轻量级指针与强指针的实现类都是sp,但是与轻量级指针相关的部分只有成员变量m_ptr以及构造函数和析构函数,m_ptr是一个指针,指向世纪引用的对象,它是在构造函数里面初始化的。

此种指针作为一个对象,在生成以及脱离自己作用范围而析构时,会自动调用自己的构造函数和析构函数,从未自动维护一个引用计数,来控制它所引用的对象的生命周期。

2.强指针和弱指针

一个类的对象要指针强指针或弱指针就必须从RefBase类继承下来。这两种指针通常配合使用。下面提几个关键点:

1.一个对象的拖引用计数一定是大于或者等于它的强引用计数。

2.如果一个对象的声明周期控制标志值设置为0,那么只要它的强引用计数为0,系统就会自动释放这个对象;如果该标志值为OBJECT_LIFETIME_WEAK,那么只有当它的强引用计数和弱一引用计数都为0时,系统才会释放这个对象;如果该标志值为OBJECT_LIFETIME_FOREVER,那么系统就不会自动释放这个对象,此时智能指针就退化为普通的指针,需要由开发人员手动释放这个对象。

3.强指针在增加强引用计数时,必定会增加弱引用计数。

4.弱指针不能直接操作所引用的对象,而必须先升级为强指针,这是通过调用它的成员函数promote来实现的。

5.一个对象是否被强指针引用过,异地第一次和最后一次被强指针引用都可以出发一些业务逻辑,此时我们有必要的话可以重写成员函数onFirstRef和onLastRef.

--------------------------------------------------------------------------------------------------------------------------------------------------------

一点感想:关于轻量级指针比较好理解,但是强指针和弱指针,他们对对象的引用计数的控制更细。但是他们都是利用智能指针是对象,可以自动调用构造函数和析构函数,来实现引用计数的自动维护。