理论教育 Android中的弱指针和强指针使用方法详解

Android中的弱指针和强指针使用方法详解

时间:2023-06-19 理论教育 版权反馈
【摘要】:在Android系统中,弱指针和强指针使用一样的引用计数类:RefBase类。另外,弱指针还有一个类型是weakref_type指针的额外的成员变量m_refs。类wp在文件frameworks\native\include\utils\RefBase.h中定义,具体实现代码如下。再看类wp的析构函数,此函数直接调用目标对象的weakref_impl对象的函数decWeak,目的是减少弱引用计数。如果坚持要操作目标对象,则需要把弱指针升级为强指针。升级方法是使用成员变量m_ptr和m_refs构造一个强指针sp,m_ptr是指目标对象的一个指针,m_refs是指指向目标对象里面的weakref_impl对象。

Android中的弱指针和强指针使用方法详解

在Android系统中,弱指针和强指针使用一样的引用计数类:RefBase类。和强指针类一样,弱指针也有一个指向目标对象的成员变量m_ptr。另外,弱指针还有一个类型是weakref_type指针的额外的成员变量m_refs。类wp在文件frameworks\native\include\utils\RefBase.h中定义,具体实现代码如下。

类wp的构造函数的实现代码如下。

在上述代码中,参数other类继承于类RefBase,并调用了类RefBase的成员函数createWeak。函数createWeak在文件frameworks\native\libs\utils\RefBase.cpp中定义,具体实现代码如下。

再看类wp的析构函数,此函数直接调用目标对象的weakref_impl对象的函数decWeak,目的是减少弱引用计数。当弱引用计数为0时,根据在目标对象的标志位(0、OBJECT_LIFETIME_WEAK或者OBJECT_LIFETIME_FOREVER)来决定是否要删除目标对象。下面是析构函数的实现代码。(www.daowen.com)

弱指针的最大特点是不能直接操作目标对象,原因是弱指针类没有重载“*”和“->”操作符号,而强指针重载了这两个操作符号。如果坚持要操作目标对象,则需要把弱指针升级为强指针。升级方法是使用成员变量m_ptr和m_refs构造一个强指针sp,m_ptr是指目标对象的一个指针,m_refs是指指向目标对象里面的weakref_impl对象。升级代码如下:

与之对应的强指针构造代码如下:

在上述构造代码中,初始化指向了目标对象的成员变量m_ptr。如果还存在目标对象,则m_ptr指向目标对象。如果这个目标对象已经不存在,则m_ptr为NULL。是否升级成功需要参考函数attemptIncStrong的返回结果。函数attemptIncStrong的具体实现代码如下。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈