这段代码为什么给EXC_BAD_ACCESS?

问题描述:

我正在为iPhone上的Cocos2d游戏工作。这段代码为什么给EXC_BAD_ACCESS?

以我init方法我有一个对象(类型ID)声明如下(也note注意bossDir被声明为1):在一计时器方法

bossMov = [CCMoveTo actionWithDuration:1.0f position:ccp(75*bossDir, 320-55)]; 
    [boss runAction:bossMov]; 

然后,我有:

if ([bossMov isDone] == YES) { 
    bossDir = -bossDir; 
    [boss stopAllActions]; 
    [boss runAction:bossMov]; 
} 

它移动的老板一次,但之后它给EXC_BAD_ACCESS,并指出我的文件“CCTimer.m”这样一行:

if(elapsed >= interval) { 
    impMethod(target, selector, elapsed); //This line in particular. 
    elapsed = 0; 
} 

我该如何解决这个问题?

您不保留bossMov操作。所以当你拨打[boss stopAllActions];它被释放和释放。然后你试图运行释放的动作 - 所以你得到了不好的访问。

你有没有尝试NSZombieEnabled,因为我不是一个cocos2d的家伙,但只是作为一个建议,我告诉你这一点。因为访问错误只会在您指向不再存在于内存中的对象时才会出现,并且如果您尝试这样做,应用程序会崩溃

+0

非常感谢这个答案,它真的救了我使用NSZombie!我有一个玩家实例(NSObject),它是一个autorelease对象,因为我假定所有的CCSprite(cocos2d)等都是autorelease,但是我没有想到的是,cocos2d库将所有CCSprites存储在数组中,所以它们被用在某处意味着它们不会被释放,但是我的播放器实例在初始化后立即被释放,然后当我的主定时器被调用时程序会崩溃。然后,我更改了要保留的玩家,并在我的分配中释放它。再次感谢:) – 2012-01-19 13:33:01

+0

很高兴帮助你 – Radix 2012-02-16 06:49:42