Android中的sp和wp指针
经常会在android的framework代码中发现sp<xxx>和wp<xxx>这样的指针,平时看的时候都把他当成一个普通的指针封装过掉了,这几天终于忍不住了,想深入了解一下。
?
相关的代码:
frameworks/base/include/utils/RefBase.h
frameworks/base/libs/utils/RefBase.cpp
?
sp和wp都是一个模板类,看一下sp类的定义:
?
?
?其中weakref_type是RefBase的内嵌类,weakref_impl则是weakref_type的子类,RefBase的大部分工作都是交由weakref_impl类来完成,通过RefBase的成员变量weakref_impl* const mRefs。查看其中一个sp的构造函数:
?
?
????????extendObjectLifetime(OBJECT_LIFETIME_WEAK);???
?
这时的打印结果是:
D/sp-wp-sample(? 217): WPTest constructor
D/sp-wp-sample(? 217): promote to strong ptr...
D/sp-wp-sample(? 217): first weak ptr ref callbac
D/sp-wp-sample(? 217): strong ptr's lifetime is j
D/sp-wp-sample(? 217): last strong ptr ref callba
D/sp-wp-sample(? 217): weak ptr's lifetime is j
D/sp-wp-sample(? 217): last weak ptr ref callback
D/sp-wp-sample(? 217): WPTest destructor
D/sp-wp-sample(? 217): weak ptr is out of scope.
?
可以看出现在只有当强引用和弱引用的计数都为0时,WPTest对象才会被销毁。