现在的位置: 首页 > 综合 > 正文

android智能指针 sp wp归纳总结

2018年06月06日 ⁄ 综合 ⁄ 共 955字 ⁄ 字号 评论关闭

参考牛人的源码分析文章http://blog.csdn.net/luoshengyang/article/details/6786239 和《深入理解Android》

其中要点:

1、智能指针引用计数框架原理:当父对象要引用子对象时,就对子对象使用强引用计数技术,而当子对象要引用父对象时,就对父对象使用弱引用计数技术,而当垃圾收集系统执行对象回收工作时,只要发现对象的强引用计数为0,而不管它的弱引用计数是否为0,都可以回收这个对象,但是,如果我们只对一个对象持有弱引用计数,当我们要使用这个对象时,就不直接使用了,必须要把这个弱引用升级成为强引用时,才能使用这个对象,在转换的过程中,如果对象已经不存在,那么转换就失败了,这时候就说明这个对象已经被销毁了,不能再使用了。

2、智能指针实现框架:由一个对象来提供引用计数器,但是这个对象不会去维护这个引用计数器的值,而是由智能指针来维护;具体说是,第一是要定义一个负责提供引用计数器的公共类,第二是实现相应的智能指针对象类;

3、android源码涉及RefBase,sp,wp

(1)强引用与弱引用计数

RefBase中有一个隐含的对象,该对象内部有强弱引用计数。

sp化后,强弱引用计数各增加1,sp析构后,强弱引用计数各减1

wp化后,弱引用计数加1,wp析构后,弱引用计数减1

强引用为0,导致实际对象被delete

弱引用为0,将导致隐含对象被delete

(2)弱引用操作

弱指针的最大特点是它不能直接操作目标对象,在于弱指针类没有重载*和->操作符号,而强指针重载了这两个操作符号。但是,如果我们要操作目标对象,需要把弱指针升级为强指针。

(3)目标对象生命周期控制

目标对象生命周期控制除强弱引用计数外,还有flag标志

 A. 如果对象的标志位被设置为0,那么只要发现对象的强引用计数值为0,那就会自动delete掉这个对象;

        B. 如果对象的标志位被设置为OBJECT_LIFETIME_WEAK,那么只有当对象的强引用计数和弱引用计数都为0的时候,才会自动delete掉这个对象;

        C. 如果对象的标志位被设置为OBJECT_LIFETIME_FOREVER,那么对象就永远不会自动被delete掉,谁new出来的对象谁来delete掉。

抱歉!评论已关闭.