最近项目经常会在AutoreleasePool::clear时crash,而且很没有规律,对于那个有问题的对象,有时是进入CCASSERT(_referenceCount > 0, “reference count should greater than 0”),有时是在delete this时crash。两种情况堆栈信息都很短,没有业务代码调用堆栈。
猜测可能是业务代码错误调用autorelease导致的,于是在Ref::autorelease中加了个前置断言:
if (PoolManager::getInstance()->isObjectInPools(this))
{
CC_ASSERT(_referenceCount > 1);
}
跑了几次,终于触发了这个断言,发现是在create一个显示对象时,先new, init, 然后autorelease时触发的。
到这里我就迷惑了,新new出来的对象怎么会已经存在于AutoreleasePool中呢?
可能会是什么原因呢?