无法理解什么是错误,获得EXC_BAD_ACCESS,任何提示?

时间:2012-08-02 23:12:44

标签: objective-c memory-management cocos2d-iphone

我在这个初始化方法中有这个精灵

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保留了该对象。 (自动释放也可以)

虽然当我发布时,我稍后会得到EXC_BAD_ACCESS(代码= 1)。我也尝试将版本移动到dealloc方法,但它给了我同样的错误。

引用lineDrawer的唯一对象是spriteobject(Player:CCSprite)它在中定义并且它没有getter所以它甚至不能被另一个对象访问,所以我不知道看看这怎么可能发生。什么时候可以调用lineDrawer当只有所有者引用它时它被解除分配?

它发生在CCLayer的draw方法中的CC_NODE_DRAW_SETUP()行上。

任何提示?我知道这些问题总是难以解决,因为缺少代码但是很难知道要向您展示什么代码。如果我知道我可以自己解决它。我也尝试在仪器中调试一些,但我不确定在哪里看。

更新下, 我尝试使用zombies启用调试

This is the result

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

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

我有一种感觉,它的某些方法是预定的还是什么......

2 个答案:

答案 0 :(得分:1)

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

但是,您发布的代码中的任何内容都显示错误,但LineDrawer继承自CCLayer,我不认为CCLayer曾被设计用作CCSprite的孩子......它真的需要成为你玩家对象的孩子吗? (例如,它应该跟随你的播放器精灵移动和旋转吗?)通常,一个图层是你的活动CCScene节点或另一个图层的子节点。

答案 1 :(得分:0)

当你using ARC时,大多数问题都不会再发生了。

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

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