I have encountered strange behavior of autorelease. I might be wrong but this works correctly in objective-c reference counting model. But in cocos implementation it fails
Scenario (I am using new pool only to demonstrate behavior – it obviously happens without it but it’s harder to find):
//Create new autorelease pool CCPoolManager::getInstance()->push(); //Create dummy object. It's reference counter should be 1 CCObject * object = new CCObject(); //Mark current object as autorelease object->autorelease(); //Mark object as autorelease again object->autorelease(); //Retain - counter should be (and is) 2 object->retain(); //Drain my pool (that should decrement by 1) CCPoolManager::getInstance()->pop(); //Crash.. object->release();
The problem is in double autorelease. When I pop my newly allocated AutoreReleasePool it set’s to all children m_bManaged = false. That’s correct. But than m_pManagedObjectArray->removeAllObjects(); is called and on each item in this array is called release. That results in counter decrement by 2 and deallocation. That’s definitely not correct. Object should be deallocated in my last function but instead of that I am triing to access already empty object.