最近在读 android 源码,学到不少有用的东西,写篇博文记录一下。
首先介绍一下 RefBase,sp,wp:
RefBase是所有对象的鼻祖类似于Java中的Object,它结合了sp和wp,实现了一套通过引用计数的方法来控制对象生命周期的机制。那么sp和wp分别是什么呢?网上有很多资料把他们解释为smart pointer,也就是智能指针,其实并不准确。其实sp就是strong pointer,wp则是weak pointer,分别叫做强指针和弱指针。下面通过源码来具体介绍一下:
RefBase::RefBase():mRefs(new weakref_impl(this)){}
这是RefBase的构造函数,它给成员变量mRefs赋值为weakref_impl类型对象,暂且把它叫做影子对象。
weakref_impl(RefBase* base):mStrong(INITIAL_STRONG_VALUE)//强引用计数,初始值0x1000000 ,mWeak(0) //弱引用计数,初始值0 ,mBase(base) // ,mFlags(0) ,mStringRefs(NULL) {}
可以看到一个RefBase对象中包含了一个影子对象,影子对象里包含了强弱引用计数。下面看sp对象:
sp<T>::sp(T* other):m_ptr(other) { if(other) other->incStrong(this); }
sp对象需要用RefBase对象来初始化,所以other就是RefBase所代表的对象了。接着看RefBase类中的 incStrong函数。
void RefBase::incStrong(const void* id) const { weakref_impl* const refs=mRefs; refs->addWeakRef(id); refs->incWeak(id); ...... refs->addStrongRef(id); const int32_t c=android_atomic_inc(&refs->mStrong);//原子+1操作,返回旧值,即参数+1,返回+1前的值 if(c!=INITIAL_STRONG_VALUE){ return; } android_atomic_add(-INITIAL_STRONG_VALUE,&refs->mStrong);//原子加,参数相加 const_cast<RefBase*>(this)->onFirstRef(); }
看完sp的构造之后,来看一下wp的构造
wp<T>::wp(const sp<T>& other):m_ptr(other.m_ptr) { if(m_ptr){ m_refs=m_ptr->createWeak(this); } }
下面看一下wp的析构函数
wp<T>::~wp() { if(m_ptr) m_refs->decWeak(this); }
接着sp的析构:
if(m_ptr) m_ptr->decStrong(this);
这就是比较基本的RefBase、sp、wp的关系啦,其实对象的生命周期,还有其他的因素,不过都是围绕这三个对象和强弱引用计数来进行的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于