简单的说,RefPtr变量被赋值时,引用计数加1,当这个变量赋值给其他变量时,引用计数减1。
PassRefPtr和RefPtr一样,被赋值和赋值给其他变量时,引用计数会发生变化。除此之外,当PassRefPtr变量赋值给另外一个PassRefPtr或者RefPtr变量时,其本身的计数器将会变成0。
所以赋值一般用这种形式:
static RefPtr<Ring> g_oneRingToRuleThemAll; void finish(PassRefPtr<Ring> prpRing) { RefPtr<Ring> ring = prpRing; g_oneRingToRuleThemAll = ring; ... ring->wear(); }创建一个对象一般用这种形式:
PassRefPtr<Node> Node::create() { return adoptRef(new Node); } RefPtr<Node> e = Node::create();几条原则:
1. 局部变量建议使用RefPtr,不用PassRefPtr
2. 成员变量使用RefPtr,不能用PassRefPtr
3. 函数参数使用PassRefPtr,不用RefPtr
4. 函数返回值用PassRefPtr,局部变量使用release()
建议在不熟悉的情况下尽量使用raw points:
RefPtr<Node> node = adoptRef(rawNodePointer);
RefPtr<Node> node = createSpecialNode();
Node* rawNodePointer = node.release().leakRef();
但是要记住自己维护计数器。