看object类的实现就行了。
首先映入眼帘的是它们:
protected: /// count of references unsigned int _reference; /// count of autorelease unsigned int _autoReleaseCount;
就是两个函数retain和release在修改它。
/** * Retains the ownership. * * This increases the object's reference count. * * @see release, autorelease * @js NA */ inline void retain() { CCASSERT(_reference > 0, "reference count should greater than 0"); ++_reference; }
/** * Release the ownership immediately. * * This decrements the object's reference count. * * If the reference count reaches 0 after the descrement, this object is * destructed. * * @see retain, autorelease * @js NA */ inline void release() { CCASSERT(_reference > 0, "reference count should greater than 0"); --_reference; if (_reference == 0) delete this; }
但_autoReleaseCount怎么用的呢?
我们发现它是protected的,吐槽,改为【private的,用setter/getter比较友好。
这个东东是代码到处可见的addObejct里面会改变滴:
void AutoreleasePool::addObject(Object* object) { _managedObjectArray->addObject(object); CCASSERT(object->_reference > 1, "reference count should be greater than 1"); ++(object->_autoReleaseCount); object->release(); // no ref count, in this case autorelease pool added. }
Array* Array::clone() const { Array* ret = new Array(); ret->autorelease();
Object* Object::autorelease() { PoolManager::sharedPoolManager()->addObject(this); return this; }
void PoolManager::addObject(Object* object) { getCurReleasePool()->addObject(object); } void AutoreleasePool::addObject(Object* object) { _managedObjectArray->addObject(object); CCASSERT(object->_reference > 1, "reference count should be greater than 1"); ++(object->_autoReleaseCount); object->release(); // no ref count, in this case autorelease pool added. }
Object::Object() : _luaID(0) , _reference(1) // when the object is created, the reference count of it is 1 , _autoReleaseCount(0) { static unsigned int uObjectCount = 0; _ID = ++uObjectCount; }
嗯,赶脚好麻烦,估计这部分要被干掉,用C++11自带的智能指针。