The reference shouldn't be 0 because it is still in autorelease pool

下载了一个别人大概2.X的源码,改成3.1的。
遇到了一下问题:

Assert failed: The reference shouldn’t be 0 because it is still in autorelease pool.
Assertion failed!

是这段代码报错:

— Begin quote from ____

MenuItemImage *newGameItem = MenuItemImage::create(“newGameA.png”, “newGameB.png”,CC_CALLBACK_1(GameMenu::menuNewGameCallback,this));
MenuItemImage *continueItem = MenuItemImage::create(“continueA.png”, “continueB.png”,CC_CALLBACK_1(GameMenu::menuContinueCallback,this));
MenuItemImage aboutItem = MenuItemImage::create(“aboutA.png”, “aboutB.png”,CC_CALLBACK_1(GameMenu::menuAboutCallback,this));
soundItem = MenuItemImage::create(“sound-on-A.png”, “sound-on-B.png”,CC_CALLBACK_1(GameMenu::menuSoundCallback,this));
Menu
mainmenu = Menu::create(newGameItem,continueItem,aboutItem,soundItem,NULL);

— End quote

debug进去的时候发现是Menu调用create的时候生成了一个Vector,并临时生成了几个MenuItem,在回收这几个Item的时候报错了。

开始以为是几个item没有引用的原因,retain了一下也是报错,然后网上搜索了一下,没有相关的信息,看到Ref里面也写了,初始化的时候他的referenceCount就+1了,所有觉得不是retain的原因。

新人,求搭救。

单这段代码没什么问题。soundItem是在别的地方声明?

断言的意思是ref还在内存管理池中但是引用已经是0了。

soundItem是一个成员变量
最新进展:

— Begin quote from ____

auto newGameItem = MenuItemImage::create(“newGameA.png”, “newGameB.png”,CC_CALLBACK_1(GameMenu::menuNewGameCallback,this));
newGameItem->retain();
newGameItem->autorelease();
auto continueItem = MenuItemImage::create(“continueA.png”, “continueB.png”,CC_CALLBACK_1(GameMenu::menuContinueCallback,this));
continueItem->retain();
continueItem->autorelease();
auto aboutItem = MenuItemImage::create(“aboutA.png”, “aboutB.png”,CC_CALLBACK_1(GameMenu::menuAboutCallback,this));
aboutItem->retain();
aboutItem->autorelease();
soundItem = MenuItemImage::create(“sound-on-A.png”, “sound-on-B.png”,CC_CALLBACK_1(GameMenu::menuSoundCallback,this));
soundItem->retain();
soundItem->autorelease();
auto mainmenu = Menu::create(newGameItem,continueItem,aboutItem,soundItem,NULL);
mainmenu->retain();
mainmenu->autorelease();

— End quote

这样就报了
HEAP: Free Heap block 74838c8 modified at 74838f4 after it was freed

这样就转到了C++的问题了

create已经做了autorelease,为什么又进行retain,autorelease?

楼主先看一下这篇文章吧。http://www.benmutou.com/archives/61