涉及的源文件
frameworks\base\include\utils\RefBase.h
frameworks\base\include\utils\Atomic.h
frameworks\base\libs\utils\RefBase.cpp
RefBase类是android native中所有类的基类
sp类是strong pointer
wp类是weak pointer
简略实例分析
class A :public RefBase
{
}
int main()
{
A* pA = new A();-----------------------(1)
{
sp<A> spA(pA);------------------------(2)
wp<A> wpA(pA);-----------------------(3)
}
------------------------------------------------(4)
}
(1)构建对象pA-------------------------------------------->我们称之为实际对象
1>查看RefBase的构造函数
RefBase::RefBase()
: mRefs(new weakref_impl(this))
{
// LOGV("Creating refs %p with RefBase %p\n", mRefs, this);
}
同时,构建了一个mRefs对象---------------------->我们称之为影子对象
2>查看weakref_impl的构造函数
weakref_impl派生于RefBase的内部类weakref_type
weakref_impl(RefBase* base)
: mStrong(INITIAL_STRONG_VALUE)----------------->sp 引用计数
, mWeak(0)---------------------------------------------------->wp引用计数
, mBase(base)------------------------------------------------>实际对象,也就是pA
, mFlags(0)
, mDestroyer(0)
{
}
(2)sp引用spA
成员变量m_ptr---------------->实际对象,也就是pA
mWeak == 1
mStrong==1
(3)wp引用对象wpA
成员变量m_ptr--------------->实际对象,也就是pA
m_refs-------------------------->影子对象,也就是mRefs
mWeak=1;
(4)析构spA,wpA
至此,mStrong==1, mWeak==2
mStrong==0时,delete 实际对象pA
mWeak==0时,delete影子对象mRefs