0

我有带有级别和两个按钮的 nsmutablearray。下一级,然后再试一次。当用户触摸下一个级别时,我设置了 objectAtIndex:indexCurrLevel+1 并且下一个级别正在加载没有问题。但是,如果用户再次触摸,我尝试将级别设置为 objectAtIndex:indexCurrLevel app crashed with children already added error。这太疯狂了,因为如果我为 ex 手动设置重试。objectAtIndex:5 可以完美运行,直到用户不玩 5 级,因为应用程序崩溃了。

对于与当前级别索引不同的索引,可以完美运行。(objectAtIndex:index - works) 手动设置索引的原因与使用索引相同。

[self removeFromParentAndCleanup:YES];

    Levels *l = [levels2 objectAtIndex:index-1];
    Game *hl = [[Game alloc]initWithObstacles:[l staticO] :[l rotateO]:[l lvl]:[l level]:[l pendulumO]:self.levelsArray];
    [hl setLevels2:self.levels2];
    [hl setBasketY:[l basketY]];
    [hl setBasketX:[l basketX]];


    [l release];

    [[CCDirector sharedDirector] replaceScene:(CCScene*) hl];    
    [hl configureLevel];
    [hl release];

Eroor:断言失败 -[Game addChild:z:tag:], ../libs/cocos2d/CCNode.m:388 2012-05-11 19:03:20.349 Game[932:10a03] * 由于未捕获而终止应用程序异常'NSInternalInconsistencyException',原因:'孩子已经添加。不能再次添加' *首先抛出调用堆栈:

4

3 回答 3

0

尝试删除语句[l release]。一般来说,您应该只释放您调用的对象,或者您使用以或retain开头的方法获得的对象。该数组还将保留每个级别,并且将其保留为级别的所有者可能是合适的。在 Xcode 中运行静态分析器以找出这些问题。initnewcopylevels2

于 2012-05-12T01:57:39.440 回答
0

猜测数组边界问题,但没有代码示例或崩溃日志就无法验证。

于 2012-05-11T14:09:43.600 回答
0

阅读消息:您正在尝试 addChild 一个已经有父对象的对象......即已经作为 CCNode 后代的子代添加到代码库中的其他地方。CCNode 的第 388 行是 NSAssert,不可破解。暂时把CCNode改成有breakable指令,如下:

if (nil==child) {
    CCLOG(@"%@<addChild> : have nil child. not adding.",self.class);
    return;
}
if (child.parent) {
    CCLOG(@"%@<addChild> : This child is already added somewhere. not adding.",self.class); // **** PUT BREAKPOINT HERE *****//
    return;
}

NSAssert( child != nil, @"Argument must be non-nil"); // was line 388
NSAssert( child.parent == nil, @"child already added. It can't be added again");

最后两行来自 CCNode(在我的项目中)。如果发生您提到的错误,我会在指示的行处中断,重新运行,然后查看堆栈跟踪。当你完成你的开发/测试周期,并且这些事情对你来说很重要时,记住将 cocos2d 恢复到它的原始状态以用于这些临时 mod。

于 2012-05-12T03:48:51.083 回答