0

我在它的 init 方法中有这个精灵

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(code=1) 。我也尝试将发布移动到 dealloc 方法,但它给了我同样的错误。

唯一引用 lineDrawer 的对象是它定义的 spriteobject (Player : CCSprite) ,它没有 getter,所以它甚至不能被另一个对象访问,所以我不明白这是怎么发生的。什么时候可以调用 lineDrawer 当只有所有者引用它时它被释放了?

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

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

更新,我尝试在启用僵尸的情况下进行调试

这是结果

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

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

我有一种感觉,它是某种预定的方法或其他东西..

4

2 回答 2

1

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

但是,您发布的代码中似乎没有任何错误,除了LineDrawer继承自CCLayer并且我不认为它CCLayer被设计为用作CCSprite...的子对象...它真的需要成为您的 Player 对象的子对象吗? (例如,当它移动和旋转时它是否应该跟随您的玩家精灵?)通常,一个层是您的活动CCScene节点或另一个层的子层。

于 2012-08-03T00:25:06.963 回答
0

当您使用 ARC时,这些问题中的大多数都不会再发生了。

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

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

于 2012-08-02T23:21:47.843 回答