Sprite kit 线程1:执行错误访问(代码=1),地址=0x600000000000018)

Sprite kit 线程1:执行错误访问(代码=1),地址=0x600000000000018),sprite-kit,exc-bad-access,beta,Sprite Kit,Exc Bad Access,Beta,阅读所有关于此错误的文章,这些错误与内存有关,并且试图访问不再存在的内容 问题:错误几乎以随机间隔弹出。它可以在第一个敌人被杀死或第n个敌人被杀死后出现。然而,它只有在敌人被杀死时才会出现 测试:在iPhone 5s上运行iOS 8 beta 5、Xcode 6 beta 5 代码流: 敌人的SKNodes类实例在级别开始时创建,并存储在NSMutableArray中以供参考: Goblin *newGoblin = [[Goblin alloc] initFacingDirection:1];

阅读所有关于此错误的文章,这些错误与内存有关,并且试图访问不再存在的内容

问题:错误几乎以随机间隔弹出。它可以在第一个敌人被杀死或第n个敌人被杀死后出现。然而,它只有在敌人被杀死时才会出现

测试:在iPhone 5s上运行iOS 8 beta 5、Xcode 6 beta 5

代码流:

敌人的SKNodes类实例在级别开始时创建,并存储在NSMutableArray中以供参考:

Goblin *newGoblin = [[Goblin alloc] initFacingDirection:1];
// set various properties…
[enemyGoblins addObject:newGoblin];
玩家的剑与敌人接触:

NSMutableArray *discardedItems = [NSMutableArray array];

for(Goblin *object in enemyGoblins)
{
    [object runBloodBurst:true damagePoints:_player.swordDamage];
    if(object.goblinHealth < 0)
        [discardedItems addObject:object];
}

if([discardedItems count] > 0)
    [enemyGoblins removeObjectsInArray:discardedItems];
NSMutableArray*discardedItems=[NSMutableArray];
用于(enemyGoblins中的Goblin*对象)
{
[物品runBloodBurst:真实伤害点:_玩家.剑术法师];
if(object.goblinHealth<0)
[丢弃EditEMS添加对象:对象];
}
如果([discardedItems计数]>0)
[enemyGoblins移除ObjectsInArray:DiscardedEditEMS];
在地精类中,“死亡”代码为:

if(self.goblinHealth < 0)
{
    SKAction *wait0 = [SKAction waitForDuration:1.0];

    SKAction *block0 = [SKAction runBlock:^{
        [self removeActionForKey:@"animation"];
        [self runAction:[_animations goblin_dieLeft]];
    }];

    SKAction *block1 = [SKAction runBlock:^{
        [self removeFromParent];
    }];

    [self runAction:[SKAction sequence:@[block0, wait0, block1]]];

}
if(self.goblinHealth<0)
{
SKAction*wait0=[SKAction waitForDuration:1.0];
SKAction*block0=[SKAction运行块:^{
[self-removeActionForKey:@“动画”];
[自我运行:[[u animations goblin_dieLeft]];
}];
SKAction*block1=[SKAction运行块:^{
[自我远离父母];
}];
[自运行操作:[SKAction序列:@[block0,wait0,block1]];
}
我所尝试的: 我禁用了“discardedItems”代码,因为我认为一旦引用丢失,ARC可能会从内存中转储对象,随后的地精类的“死亡动画”会导致崩溃,但这并没有解决问题。 我尝试了僵尸和断点,但也没有得到有用的线索

关于我所做的尝试,我是不是找错了方向,或者有没有人在Beta 5中遇到过类似的问题

编辑

以下是回溯:

(lldb)英国电信 *线程#1:tid=0x3264b,0x000000018cb13434 SpriteKit
SKCSprite::update(double)+404,队列='com.apple.main thread',停止原因=EXC_BAD_访问(代码=1,地址=0x70000000000018)
帧#0:0x000000018cb13434 SpriteKit
SKCSprite::update(double)+404 帧#1:0x000000018cb13440 SpriteKit
SKCSprite::update(double)+416
帧#2:0x000000018cb13440 SpriteKit
SKCSprite::update(double)+416 帧#3:0x000000018cacbf28 SpriteKit
-[SKScene\u update:][140
帧#4:0x000000018cae63f8 SpriteKit
-[SKView(Private)\u update:+568 帧#5:0x000000018cae3a10 SpriteKit
-[SKView renderCallback:+764
帧#6:0x000000018cae0a9c SpriteKit
\uuuuu29-[SKView setUpRenderCallback]\ublock\uinvoke+60 帧#7:0x000000018cb0d890 SpriteKit
-[SKDisplayLink\u callbackbornextframe:+272
帧#8:0x000000010042ca9c libglinterrese.dylib
-[DYDisplayLinkInterposer forwardDisplayLinkCallback:][168 帧#9:0x000000018c615b90 QuartzCore
CA::Display::DisplayLinkItem::dispatch()+32
帧#10:0x000000018c615a28 QuartzCore
CA::Display::DisplayLink::dispatch#u项(无符号长、无符号长、无符号长)+324 帧#11:0x00000001897dddc0 IOKit
IioSpatchCallout fromCFMessage+376
帧#12:0x00000001885dcf34核心基础
帧#13:0x00000001885f1b38 CoreFoundation
uuu CFRUNLOOP_u正在调用u OUT_u以执行u函数uu+56
帧14:0x00000001885f1a98 CoreFoundation
帧#15:0x00000001885efa18 CoreFoundation
uu CFRunLoopRun+1640
帧#16:0x000000018851d664 CoreFoundation
CFRunLoopRunSpecific+396 帧#17:0x000000019154f5a4图形服务
GSEventRunModal+168
帧#18:0x000000018ccd6164 UIKit
UIApplicationMain+1488 *帧19:0x0000000100165530 CarcerQuest
main(argc=1,argv=0x000000016fdab9d8)+116位于main处。m:16
帧#20:0x000000019885aa08 libdyld.dylib
start+4 (lldb)


在浏览了苹果支持论坛并在iOS 7上运行了相同的项目后,这似乎是一个测试版错误,毕竟不是错误代码。

阅读了您问题的评论,我不确定您是否解决了这个问题,您的代码片段不够完整,我无法看到您的问题,但我最近遇到了一个类似的问题,我花了一段时间才弄明白,所以我会把它贴出来,以防它对你或将来的读者有所帮助

您可以在此处看到我的代码更改:

基本上,
runAction
是异步的。它在下一个屏幕刷新周期中执行(因此堆栈跟踪中的显示链接调用)。因此,如果在
runAction
之后调用
removeSomething
,它可以在操作运行之前执行,您将崩溃

至少这正是吸引我的原因——我不知道为什么它从未出现在iOS 7中。请参阅下面的代码

- [self removeFromParentCell]; // Used to call it here - wrong.
  SKAction *wait = [SKAction waitForDuration:GSTATE.animationDuration];
  SKAction *remove = [SKAction removeFromParent];
- [self runAction:[SKAction sequence:@[wait, remove]]];
+ [self runAction:[SKAction sequence:@[wait, remove]] completion:^{
+   [self removeFromParentCell];  // This is right.
+ }];
改变

[自运行操作:[SKAction序列:@[block0,wait0,block1]]

[self runAction:[SKAction sequence:@[block0,wait0]]完成:^{
[_自我离开父母];
}];


我在更新IOS7代码以在IOS8上运行时遇到了相同的问题,并使用完成块修复了该问题

发布调用堆栈和发生错误的确切行,添加异常断点以查找out@LearnCocos2D-增加backtrace@CodeMonkey-每一个敌人职业都有一个“死布尔”,当生命值小于0时,它会阻止任何其他职业运行。让我挠头的问题是这次崩溃几乎是随机的。有时发生在第三个敌人身上,有时发生在第二十个敌人身上。我在代码中添加了几个“If(object!=nil)”,但崩溃仍然发生。它崩溃在哪一行?