在SKScene的子节点上运行简单的操作会导致iOS 7.1中的EXC_BAD_ACCESS

DanDan

在我一直在开发的SpriteKit游戏中进行最后润色时,遇到了此运行时错误。在iOS 8上运行正常,但在iOS 7.1(模拟器和设备)上均崩溃。

我创建了一个小项目,它重新创建了我要处理的问题。它通过取消存档在Xcode 6中提供的编辑器中创建的sks文件来创建GameScene(就像创建新的SpriteKit项目时生成的示例项目一样)。在使用生成的场景中获取对精灵的引用之后childNodeWithName:,尝试对其执行简单的操作会使程序崩溃并引发EXC_BAD_ACCESS直接修改Sprite的属性似乎可以正常工作(请参见代码)。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];

        SKSpriteNode *sprite = (SKSpriteNode*)[self childNodeWithName:@"sprite"];

        // This works.
        sprite.position = location;

        SKAction *action = [SKAction moveByX:100 y:0 duration:1];

        // This doesn't.
        [sprite runAction:action];
    }
}

我一直在搜寻互联网以及自己的大脑,据我所知,我没有违反任何规则。请告诉我我错了,特别是我违反了哪个规则。因为如果这不是我的错,那么挫败感会更大。我在做iOS 7中没有的功能吗?

注意:我对通用示例SpriteKit项目(太空飞船一个)所做的唯一更改是,我在SKScene编辑器中添加了一个纯红色的sprite,将其命名为“ sprite”,并修改了touchesBegan:如上所示方法。

另请注意:以编程方式添加sprite(如示例项目中一样)不会引发此问题,并且使用childNodeWithName:获取对它的引用也可以。仅当访问已存档的sks文件中包含的sprite时,才出现此问题。

这是崩溃时的痕迹:

* thread #1: tid = 0x4da6c, 0x00000000, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00000000
frame #1: 0x009b65d7 SpriteKit`SKCSprite::update(double) + 231
frame #2: 0x009b66de SpriteKit`SKCSprite::update(double) + 494
frame #3: 0x0099bd58 SpriteKit`-[SKNode _update:] + 43
frame #4: 0x0097c003 SpriteKit`-[SKScene _update:] + 104
frame #5: 0x009919a4 SpriteKit`-[SKView(Private) _update:] + 253
frame #6: 0x0098f5e1 SpriteKit`-[SKView renderCallback:] + 936
frame #7: 0x0098cea0 SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 82
frame #8: 0x009b168f SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 268
frame #9: 0x009b19ad SpriteKit`-[SKDisplayLink _caDisplayLinkCallback] + 137
frame #10: 0x048cdd66 QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 48
frame #11: 0x048cdc22 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 310
frame #12: 0x048ce147 QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 123
frame #13: 0x006d4ac6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
frame #14: 0x006d44ad CoreFoundation`__CFRunLoopDoTimer + 1181
frame #15: 0x006bc538 CoreFoundation`__CFRunLoopRun + 1816
frame #16: 0x006bb9d3 CoreFoundation`CFRunLoopRunSpecific + 467
frame #17: 0x006bb7eb CoreFoundation`CFRunLoopRunInMode + 123
frame #18: 0x02b6a5ee GraphicsServices`GSEventRunModal + 192
frame #19: 0x02b6a42b GraphicsServices`GSEventRun + 104
frame #20: 0x00aa1f9b UIKit`UIApplicationMain + 1225
* frame #21: 0x00061a2d SKTest`main(argc=1, argv=0xbff9f39c) + 141 at main.m:14
frame #22: 0x027606d9 libdyld.dylib`start + 1
典型的

我遇到了这个问题,这里是我变通的一种解决方法。是的,这不是理想的选择,但是肯定会导致崩溃。

加载场景后,制作的副本SKSPriteNode并像这样交换新节点:

 SKSpriteNode *sprite = (SKSpriteNode*)[self childNodeWithName:@"bob"];
 SKSpriteNode *newSprite = [sprite copy];
 [sprite removeFromParent];
 [self addChild:newSprite];

现在,您可以访问SKAction该新节点上的use ,但是您喜欢使用touchesBegan方法中使用的相同代码

我的猜测是,基于.sks的节点的属性无法正确初始化。

如果您有很多节点,则可以遍历/枚举它们以进行此交换。

更新

原始海报又走了一步,发现创建GameScene的副本也可以达到目的。因此,无需遍历节点并单独制作副本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程1:Xcode 6 beta 7中的println()上的EXC_BAD_ACCESS(code = 1,address = 0x0)

来自分类Dev

ios-UIImagePickerControllerSourceTypeCamera中的UIImagePickerController在iOS7中崩溃EXC_BAD_ACCESS

来自分类Dev

iOS 7中的String(format :)崩溃-需要替代方法。线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x10)

来自分类Dev

iOS 7中的String(format :)崩溃-需要替代方法。线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x10)

来自分类Dev

在iOS7上运行的相机无法打开,然后崩溃(EXC_BAD_ACCESS)

来自分类Dev

在iOS 7上具有UIBarButtonItem外观的EXC_BAD_ACCESS

来自分类Dev

线程1:EXC_BAD_ACCESS(代码= 1,地址=)iOS

来自分类Dev

dismissViewControllerAnimated仅导致iOS 7.1中的EXC_BAD_ACCESS

来自分类Dev

OpenCV导致EXC_BAD_ACCESS线程1:UIApplicationMain中的代码= 2崩溃

来自分类Dev

OpenCV导致EXC_BAD_ACCESS线程1:UIApplicationMain中的代码= 2崩溃

来自分类Dev

单例iOS中removeFromSuperview上的EXC_BAD_ACCESS

来自分类Dev

发布中的简单代码中的EXC_BAD_ACCESS

来自分类Dev

展示Game Center时,iOS 6 EXC_BAD_ACCESS(代码= 2,地址= 0x15),但在iOS 7+中可以使用

来自分类Dev

在NSUserDefaults中存储字典导致EXC_BAD_ACCESS

来自分类Dev

Swift中的parser.parse()导致EXC_BAD_ACCESS

来自分类Dev

Xcode 7 Beta Swift应用程序在运行时因EXC_BAD_ACCESS错误而崩溃

来自分类Dev

CGContextDrawLinearGradient导致EXC_BAD_ACCESS

来自分类Dev

NSTableView与源,导致EXC_BAD_ACCESS

来自分类Dev

Swift:animator()导致EXC_BAD_ACCESS

来自分类Dev

NSLocale NSLocaleCalendar导致EXC_BAD_ACCESS

来自分类Dev

委托分配导致EXC_BAD_ACCESS

来自分类Dev

didSet导致EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS on iOS 8.1 with Dictionary

来自分类Dev

iOS EXC_BAD_ACCESS:如何调试?

来自分类Dev

CCHmac上的EXC_BAD_ACCESS

来自分类Dev

[UICollectionView setCollectionViewLayout:]上的EXC_BAD_ACCESS

来自分类Dev

在performSelectorInBackground上为EXC_BAD_ACCESS

来自分类Dev

仅在iPad上的EXC_BAD_ACCESS

来自分类Dev

setMask上的EXC_BAD_ACCESS

Related 相关文章

  1. 1

    线程1:Xcode 6 beta 7中的println()上的EXC_BAD_ACCESS(code = 1,address = 0x0)

  2. 2

    ios-UIImagePickerControllerSourceTypeCamera中的UIImagePickerController在iOS7中崩溃EXC_BAD_ACCESS

  3. 3

    iOS 7中的String(format :)崩溃-需要替代方法。线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x10)

  4. 4

    iOS 7中的String(format :)崩溃-需要替代方法。线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x10)

  5. 5

    在iOS7上运行的相机无法打开,然后崩溃(EXC_BAD_ACCESS)

  6. 6

    在iOS 7上具有UIBarButtonItem外观的EXC_BAD_ACCESS

  7. 7

    线程1:EXC_BAD_ACCESS(代码= 1,地址=)iOS

  8. 8

    dismissViewControllerAnimated仅导致iOS 7.1中的EXC_BAD_ACCESS

  9. 9

    OpenCV导致EXC_BAD_ACCESS线程1:UIApplicationMain中的代码= 2崩溃

  10. 10

    OpenCV导致EXC_BAD_ACCESS线程1:UIApplicationMain中的代码= 2崩溃

  11. 11

    单例iOS中removeFromSuperview上的EXC_BAD_ACCESS

  12. 12

    发布中的简单代码中的EXC_BAD_ACCESS

  13. 13

    展示Game Center时,iOS 6 EXC_BAD_ACCESS(代码= 2,地址= 0x15),但在iOS 7+中可以使用

  14. 14

    在NSUserDefaults中存储字典导致EXC_BAD_ACCESS

  15. 15

    Swift中的parser.parse()导致EXC_BAD_ACCESS

  16. 16

    Xcode 7 Beta Swift应用程序在运行时因EXC_BAD_ACCESS错误而崩溃

  17. 17

    CGContextDrawLinearGradient导致EXC_BAD_ACCESS

  18. 18

    NSTableView与源,导致EXC_BAD_ACCESS

  19. 19

    Swift:animator()导致EXC_BAD_ACCESS

  20. 20

    NSLocale NSLocaleCalendar导致EXC_BAD_ACCESS

  21. 21

    委托分配导致EXC_BAD_ACCESS

  22. 22

    didSet导致EXC_BAD_ACCESS

  23. 23

    EXC_BAD_ACCESS on iOS 8.1 with Dictionary

  24. 24

    iOS EXC_BAD_ACCESS:如何调试?

  25. 25

    CCHmac上的EXC_BAD_ACCESS

  26. 26

    [UICollectionView setCollectionViewLayout:]上的EXC_BAD_ACCESS

  27. 27

    在performSelectorInBackground上为EXC_BAD_ACCESS

  28. 28

    仅在iPad上的EXC_BAD_ACCESS

  29. 29

    setMask上的EXC_BAD_ACCESS

热门标签

归档