读书人

sp跟wp指针用法分析

发布时间: 2012-12-23 11:28:15 作者: rapoo

sp和wp指针用法分析

涉及的源文件

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

读书人网 >移动开发

热点推荐