2012-08-02 63 views
0

我在这个小妖精这在它的init方法不明白什么是错误的,得到EXC_BAD_ACCESS,任何提示?

lineDrawer = [[LineDrawer alloc]initWithLineColor:ccc3(color.r, color.g, color.b)]; 
lineDrawer.position = ccp(0,0); 
lineDrawer.anchorPoint = ccp(1,1); 

[self addChild:lineDrawer]; 
[self addChild:head]; 

[lineDrawer release]; 

没什么错在这里吗?我可以释放它作为addchild保留对象。 (autorelease也可以)

虽然当我有版本,我得到EXC_BAD_ACCESS(code = 1)稍后。我也试着将release发布到dealloc方法,但它给了我同样的错误。

具有参考lineDrawer的唯一对象是spriteobject(玩家:CCSprite),它在定义和它不会有一个getter所以它甚至不能被其他对象进行访问,所以我不明白如何这可能发生。什么时候可以调用lineDrawer当只有拥有者引用它时,它会被处理掉吗?

它发生在CCLayer的绘制方法内部的CC_NODE_DRAW_SETUP()行上。

任何提示?我知道这些问题在缺乏代码的情况下总是很难解决,但很难知道要向您展示的代码。如果我知道我可以自己解决它。我也尝试在仪器中调试这些,但我不确定在哪里寻找。

更新, 我试图与僵尸调试启用

This is the result

这是否和你说什么? 这是LineDrawer类。这是我稍微修改过的其他人的课程。

http://pastebin.com/7Uv4GULy
http://pastebin.com/08NHeVt9

我有一种感觉,它的一些方法已排程或东西..

回答

1

由于您将lineDrawer对象添加到您的CCSprite的子集合中,因此可通过CCNode中定义的.children属性获得对其的公共引用。

然而,没有在你发布的代码似乎是错误的,只是从CCLayerLineDrawer继承,我不认为CCLayer是有史以来设计用来作为CCSprite的孩子......是否真的需要成为你的播放器对象的孩子? (例如,它应该跟随你的玩家精灵,因为它移动并旋转?)通常,图层是活动的CCScene节点或其他图层的子节点。

+0

是的,但崩溃发生在我释放播放器类后,因此儿童应该清空权利(和释放) 关于另一件事,它可能看起来有点奇怪,但它实际上是玩家的一部分,所以它对我有意义。也许它应该是LineDrawer:CCSprite,但正如你所说,它应该没关系。我现在试图用CCLOG的方式来追踪它,每次发生这种情况时都会感到沮丧,因为我一般都懒得用xcode或C来贬低它。 – 2012-08-03 00:40:50

0

大多数这些问题时,你是using ARC不会再发生。

很可能你已经过度释放了一个对象。它不一定需要是lineDrawer。也许它是lineDrawer类中的一个对象。

解决这个问题的最佳方法是在构建方案中启用NSZombieObjects并找出哪个对象被访问。

+0

谢谢,这是一个很好的观点。但是我没有看到LineDrawer的任何问题。我已经更新了我的帖子,其中包括启用僵尸的结果,但不知道它是否对你有帮助。 – 2012-08-02 23:44:18

相关问题