仅限iPad上的EXC_BAD_ACCESS

时间:2014-04-10 06:00:07

标签: ios sprite-kit exc-bad-access

当我在iPad上测试我的应用程序时,我可以始终如一地可靠地让它崩溃。当它发生时,我在main中得到一个EXC_BAD_ACCESS错误,根本原因远非明显。我已经尝试了以下步骤来尝试更多地了解它:

  1. 我启用了僵尸。这在输出中似乎没有任何影响,这让我觉得这不是一个僵尸问题(但显然我可能是错的)。
  2. 我添加了一个异常断点,但是当应用程序崩溃时,异常断点不会启动,我得到的只是main 16行旁边的标准绿色箭头。
  3. 我运行了分析器,并纠正了那里发现的一些小错误。仍然没有效果。
  4. 我已经确认,我的两名通过试飞获得该版本的测试人员也遇到了同样的问题。
  5. 我执行了'Clean'以及'Clean Build Folder'
  6. 这是特别奇怪的。当我在iPad上测试时,应用程序会一直崩溃。当我在模拟器中测试时,无论我做什么,它都不会崩溃。因此,如果它是一个僵尸,我不知道如何发现哪个对象需要更好地保留。此外,如果我在iPhone上测试,该应用程序也不会崩溃。

    发生崩溃的地方:在应用程序中,我有一些显示信息的精灵节点,当我触摸其中一个时(实际上,我触摸的是一个看起来像取消按钮的子精灵),什么应该发生的是我从其父级删除取消按钮的父级:

    [[self parent] removeFromParent];
    

    调用堆栈的图片:

    enter image description here

    主xcode窗口中的控制台中没有任何内容,但这是在设备的控制台中(来自组织者窗口:

    Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 69 +0.000164 sec [0254/060b]: far -> 788
    Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 70 +0.000079 sec [0254/060b]: esr -> 796
    Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 71 +0.000081 sec [0254/060b]: exception -> 800
    Apr 10 08:50:42 Roberts-iPad backboardd[31] <Error>: HID: The 'Passive' connection 'Bubble Fit' access to protected services is denied.
    Apr 10 08:50:43 Roberts-iPad backboardd[31] <Warning>: CoreAnimation: updates deferred for too long
    Apr 10 08:50:57 Roberts-iPad lockdownd[25] <Notice>: 01cdc000 _select_socket: receive secure message timeout!
    Apr 10 08:50:57 Roberts-iPad lockdownd[25] <Notice>: 01cdc000 _receive_message: walk away - non-SSL 1
    

    直到昨天我才认为我非常非常接近发货:P我会很感激如何更好地了解这个例外的根本原因是什么。谢谢!

    更新:正如LearnCocos2D在下面指出的那样,我很可能会链接到相同的SpriteKit错误。建议是覆盖removeFromParent。我试过这个,但它产生了一个错误:

    - (void)removeFromParent
    {
        [self removeFromParent];
        self = nil;
    
        [super removeFromParent];
    }
    

    它产生的错误是self不能分配给init之外。我该怎么改写呢?

1 个答案:

答案 0 :(得分:0)

事实证明,这确实是SpriteKit中的一个错误,在此进一步讨论:

Sprite Kit iOS 7.1 crash on removeFromParent

我的修复是重写removeFromParent,在SKShapeNode子类中包含在移除父级之前需要被删除的子项,因为:

- (void)removeFromParent
{
    [self.addButton removeFromParent];
    [self.cancelButton removeFromParent];
    self.addButton = nil;
    self.cancelButton = nil;

    [super removeFromParent];
}

子形状节点是父节点的属性。