1)RefPtr
#变量被赋值时,引用计数加1。
#当这个变量赋值给其他变量时,引用计数减1。
2)PassRefPtr
#变量被赋值时,引用计数加1。
#当这个变量赋值给其他变量时,引用计数减1。
#当PassRefPtr变量赋值给另外一个PassRefPtr或者RefPtr变量时,其本身的计数器将会变成0。
1. 局部变量建议使用RefPtr,不用PassRefPtr
2. 成员变量使用RefPtr,不能用PassRefPtr
3. 函数参数使用PassRefPtr,不用RefPtr
4. 函数返回值用PassRefPtr,局部变量使用release()
原理:RefCounted,自动地在各项操作中加上deref和ref,只能用于继承自RefCounted的对象
template<typename T> inline RefPtr<T>& RefPtr<T>::operator=(T* optr)
{
refIfNotNull(optr);
T* ptr = m_ptr;
m_ptr = optr;
derefIfNotNull(ptr);
return *this;
}
2)OwnPtr和PassOwnPtr
#它的语义就是这个对象仅仅只能由我来管理,别人都不能引用,别人赋值给我,就自动赋值为NULL。
#仅我拥有此对象的引用,当我的作用域完了后,会自动销毁。
#它比较适合不是从RefCounted继承下来的对象,并且生命周期由我控制的场景。
3)adoptRef(class)
#因此一般都是在calss constructor的时候,使用adoptRef 把class 实例转换给PassRefPtr。
#因为在class的constructor中,因为class从RefCounted 继承过来,其bass constructor会设置count=1,
这样,接下来就把整个实例交由PassRefPtr去处理了