cocos2d正確建立和釋放物件,引用計數器的使用
阿新 • • 發佈:2018-12-05
void Ref::release() { CCASSERT(_referenceCount > 0, "reference count should greater than 0"); --_referenceCount; if (_referenceCount == 0) { #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) auto poolManager = PoolManager::getInstance(); if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this)) { // Trigger an assert if the reference count is 0 but the Ref is still in autorelease pool. // This happens when 'autorelease/release' were not used in pairs with 'new/retain'. // // Wrong usage (1): // // auto obj = Node::create(); // Ref = 1, but it's an autorelease Ref which means it was in the autorelease pool. // obj->autorelease(); // Wrong: If you wish to invoke autorelease several times, you should retain `obj` first. // // Wrong usage (2): // // auto obj = Node::create(); // obj->release(); // Wrong: obj is an autorelease Ref, it will be released when clearing current pool. // // Correct usage (1): // // auto obj = Node::create(); // |- new Node(); // `new` is the pair of the `autorelease` of next line // |- autorelease(); // The pair of `new Node`. // // obj->retain(); // obj->autorelease(); // This `autorelease` is the pair of `retain` of previous line. // // Correct usage (2): // // auto obj = Node::create(); // obj->retain(); // obj->release(); // This `release` is the pair of `retain` of previous line. CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool."); } #endif delete this; } }
上面是cocos2d 3.0 ref的release方法。
分析程式碼,這個函式主要做了什麼:
1. 呼叫release方法,引用計數器 -1。
2.當引用計數器為0時,delete this 銷燬物件。
重點看那段註釋,告訴我們如何正確使用retain(),release(),new(), autorelease(),create():
註釋程式碼舉了兩種錯誤的使用和兩種正確使用的例子,總結起來就是:
1. retain(),release()配對使用。
2. new(), autorelease()配對使用。
3. new()物件後引用+1,是為autorelease()用的。