Sprite kit 线程1:执行错误访问(代码=1),地址=0x600000000000018)
阅读所有关于此错误的文章,这些错误与内存有关,并且试图访问不再存在的内容 问题:错误几乎以随机间隔弹出。它可以在第一个敌人被杀死或第n个敌人被杀死后出现。然而,它只有在敌人被杀死时才会出现 测试:在iPhone 5s上运行iOS 8 beta 5、Xcode 6 beta 5 代码流: 敌人的SKNodes类实例在级别开始时创建,并存储在NSMutableArray中以供参考: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];
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 SpriteKitSKCSprite::update(double)+404,队列='com.apple.main thread',停止原因=EXC_BAD_访问(代码=1,地址=0x70000000000018)
帧#0:0x000000018cb13434 SpriteKit
SKCSprite::update(double)+404
帧#1:0x000000018cb13440 SpriteKitSKCSprite::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 QuartzCoreCA::Display::DisplayLinkItem::dispatch()+32
帧#10:0x000000018c615a28 QuartzCore
CA::Display::DisplayLink::dispatch#u项(无符号长、无符号长、无符号长)+324
帧#11:0x00000001897dddc0 IOKitIioSpatchCallout fromCFMessage+376
帧#12:0x00000001885dcf34核心基础
帧#13:0x00000001885f1b38 CoreFoundationuuu CFRUNLOOP_u正在调用u OUT_u以执行u函数uu+56
帧14:0x00000001885f1a98 CoreFoundation
帧#15:0x00000001885efa18 CoreFoundationuu CFRunLoopRun+1640
帧#16:0x000000018851d664 CoreFoundation
CFRunLoopRunSpecific+396
帧#17:0x000000019154f5a4图形服务GSEventRunModal+168
帧#18:0x000000018ccd6164 UIKit
UIApplicationMain+1488
*帧19:0x0000000100165530 CarcerQuestmain(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)”,但崩溃仍然发生。它崩溃在哪一行?