AutoreleasePool::clear时crash,最终定位到Ref::autorelease

最近项目经常会在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中呢?
可能会是什么原因呢?

有谁遇到过类似的问题,或者给出一些建议吗?

1.clear是在每帧结束时调用的,所以和你的逻辑分离了。

2.CCASSERT(_referenceCount > 0, “reference count should greater than 0”)

一般是create后,手动release了,这时候引用计数从1->0。导致这一帧结束时再次调release的时候发现计数没有大于0。
这里的手动release不是说你去调release,有可能是你调了remove之类的引擎API,它内部调用的。

3.没代码没真相。

你是不是使用了多线程加载骨骼文件