【问题标题】:Can't understand what is wrong, get EXC_BAD_ACCESS, any hints?不明白出了什么问题,得到EXC_BAD_ACCESS,有什么提示吗?
【发布时间】:2012-08-02 23:12:44
【问题描述】:

我在它的 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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,但是崩溃发生在我释放 Player 类之后,所以孩子应该被清空(并释放)关于另一件事,它可能看起来有点奇怪,但它实际上是 playersprite 的一部分所以对于我,这说得通。也许它应该是 LineDrawer:CCSprite,但正如你所说,这不重要。我现在正试图以 CCLOG 的方式追踪它,每次发生这种情况都很令人沮丧,因为我通常不习惯在 xcode 或 C 中进行调试。
    【解决方案2】:

    当您是using ARC 时,大多数这些问题都不会再发生了。

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

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

    【讨论】:

    • 谢谢,这是一个很好的观点。但是我没有看到 LineDrawer 有任何问题。我已经用启用僵尸的结果更新了我的帖子,但不确定它是否对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多