代码是:

if(!spriteInfoBack){
        spriteInfoBack = [CCSprite spriteWithFile:@"bg_player.png"];
        [spriteInfoBack setAnchorPoint:CGPointMake(0, 1)];
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
        [parent addChild:spriteInfoBack];
}else{
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
}

崩溃输出为:
[CCSprite setPosition:]: message sent to deallocated instance 0xc59cc70

它位于这条线上:
[spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];

我认为这很奇怪,因为if(!spriteInfoBack)已经检查了实例是否已释放。

最佳答案

您需要保留CCSprite。类方法spriteWithFile返回一个自动释放的对象。存储在spriteInfoBack中的返回值不属于您。这意味着对象的生存期是直到下一个自动释放池耗尽为止。从您的代码看来,您正在使用spriteInfoBack进行延迟初始化,然后再使用。您将要做的是保留spriteWithFile的返回值,如下所示:

spriteInfoBack = [[CCSprite spriteWithFile:@"bg_player.png"] retain];

在将来的某个时刻,您将需要释放spriteInfoBack。我看不到该类的其余部分,但是如果spriteInfoBack是一个类的实例变量,那么在dealloc中这样做是有意义的。

10-08 20:12