Objective c SKD 4中Cocos2D游戏的错误访问,但不是3

Objective c SKD 4中Cocos2D游戏的错误访问,但不是3,objective-c,iphone-sdk-3.0,cocos2d-iphone,exc-bad-access,ios4,Objective C,Iphone Sdk 3.0,Cocos2d Iphone,Exc Bad Access,Ios4,是的,所以这一次通过我或循环一段时间,直到我弄明白发生了什么。随着苹果今天发布了Xcode的最终版本,iOS 4也于昨天面世,我终于开始考虑将我的应用程序移植到iOS 4上 所以我下载了新的SDK,开始工作。在我的应用程序上工作了一段时间后,想象一下当我遇到一个糟糕的访问错误(试图与一个解除分配的对象对话)时我会有多么惊讶。我讨厌那些错误,很难想出该怎么办。所以,我花了45分钟试图找到我释放的对象。我记不起我改变了什么,错误消息也帮不了我。我启用了NSZombies(Zombies!!!)并出现

是的,所以这一次通过我或循环一段时间,直到我弄明白发生了什么。随着苹果今天发布了Xcode的最终版本,iOS 4也于昨天面世,我终于开始考虑将我的应用程序移植到iOS 4上

所以我下载了新的SDK,开始工作。在我的应用程序上工作了一段时间后,想象一下当我遇到一个糟糕的访问错误(试图与一个解除分配的对象对话)时我会有多么惊讶。我讨厌那些错误,很难想出该怎么办。所以,我花了45分钟试图找到我释放的对象。我记不起我改变了什么,错误消息也帮不了我。我启用了NSZombies(Zombies!!!)并出现以下错误:

2010-06-22 15:38:28.655 ProjectPidgey[17783:207] *** -[CCTargetedTouchHandler claimedTouches]: message sent to deallocated instance 0xd834b30
这看起来很有用。我在Cocos2D,所以我想有什么东西被触动了,不再存在了?但我在代码中找不到类似的东西。因此,我一时兴起,使用了我旧版本的Xcode。编译并安装在运行iOS 3.0的模拟器上。很好。就像一个符咒,就像我做的一样

现在,我的问题是,这里发生了什么。SDK 4和SDK 3之间会导致错误Exc的区别是什么?有什么想法吗?或者这是cocos2d的问题,需要更新

编辑:我做了一些修改,发现通过删除这行代码:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchPoint = [touch locationInView:[touch view]];
    touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint];
    if ( ![super containsTouchLocation:touch] ) return NO;
    [self.engine playerHitRedDot:self];
    //[self.parent removeChild:self cleanup:YES]; //REMOVED THIS LINE
    return YES;
}
然后它就起作用了。所以看起来CCTargetTouch处理程序链接到我的精灵(当我触摸它时,它会被移除),有人发现一切都不正常。。。然而,我需要精灵被移除(或者至少消失,但我想认真对待记忆),那么我该怎么做呢

谢谢

2010-06-22 15:38:28.655 ProjectPidgey[17783:207] *** -[CCTargetedTouchHandler claimedTouches]: message sent to deallocated instance 0xd834b30
这是非常有用的。它准确地告诉你哪里出了问题;
CCTargetedTouchHandler
的过度发布实例调用了一个方法

每个基于Cocos2d的项目都嵌入了完整的源代码,如果您使用工具跟踪僵尸,您可以看到创建、保留和/或发布对象的确切位置


这可能是Cocos2d中的一个bug,但我怀疑它是否能够读取代码。这看起来更像是应用程序中的过度发布,以前没有触发崩溃,但现在确实触发了。要么某个内容没有保留,要么该保留的内容没有保留,要么该保留的内容没有保留,要么你以不安全的方式在线程之间传递内容。

我将此标记为一个答案,但因为这有助于我进行调试,但我从未发现实际的错误。我在仪器中使用了NSZombies,并尽一切可能追踪这个bug,但最终还是留下了它,一个bug。并且做了一个小技巧来绕过它(在OS4上做一件事,但在OS3上做另一件事)。这是可行的,但我希望有更好的解决方案。。。