2015-09-03 7 views
2

У меня случился сбой, вызванный EXC_BAD_ACCESS. Он не пойман, установив NSZombieEnabled в YES, указав, что он не является свободным объектом. (мальчик, я действительно этого хочу)EXC_BAD_ACCESS Сценарий перехода SpriteKit, без зомби

След стека менее полезен (для меня). Кто-нибудь видит в этом какое-то понимание?

bad address

stack trace

SpriteKit`std::__1::__tree_iterator<SKCSprite*, std::__1::__tree_node<SKCSprite*, void*>*, long> std::__1::__tree<SKCSprite*, std::__1::less<SKCSprite*>, std::__1::allocator<SKCSprite*> >::find<SKCSprite*>: 
    0x1890c376c <+0>: ldr x9, [x0, #8]! 
    0x1890c3770 <+4>: cbz x9, 0x1890c37b8   ; <+76> 
    0x1890c3774 <+8>: ldr x10, [x1] 
    0x1890c3778 <+12>: mov x8, x0 
-> 0x1890c377c <+16>: ldr x11, [x9, #32] 
    0x1890c3780 <+20>: cmp x11, x10 
    0x1890c3784 <+24>: b.hs 0x1890c3794    ; <+40> 
    0x1890c3788 <+28>: ldr x9, [x9, #8] 
    0x1890c378c <+32>: cbnz x9, 0x1890c377c   ; <+16> 
    0x1890c3790 <+36>: b  0x1890c37a0    ; <+52> 
    0x1890c3794 <+40>: mov x8, x9 
    0x1890c3798 <+44>: ldr x9, [x9] 
    0x1890c379c <+48>: cbnz x9, 0x1890c377c   ; <+16> 
    0x1890c37a0 <+52>: cmp x8, x0 
    0x1890c37a4 <+56>: b.eq 0x1890c37b8    ; <+76> 
    0x1890c37a8 <+60>: ldr x9, [x1] 
    0x1890c37ac <+64>: ldr x10, [x8, #32] 
    0x1890c37b0 <+68>: cmp x9, x10 
    0x1890c37b4 <+72>: b.hs 0x1890c37bc    ; <+80> 
    0x1890c37b8 <+76>: mov x8, x0 
    0x1890c37bc <+80>: mov x0, x8 
    0x1890c37c0 <+84>: ret  

Другой контекст:

SpriteKit приложение, которое переходит на новую сцену. Первоначально отображается новая сцена, но авария происходит сразу.

Существует действие как для входящих, так и для исходящих сцен. Эти действия содержат блок, который ссылается на сцену. Сцены протекали, и этот блок, казалось, был одним из правонарушителей. Когда я добавил код для удаления действия, этот сбой возник.

Xcode 6,4 IPad воздуха, IOS 8.4.1


Edit 1: Этот код существует на каждом SKScene. Когда второй метод закомментирован, скрывает проблему (я верю, помогая утечке).

- (void)startAutoScore { 
    // as long as you survive, you gradually accumulate points 
    SKAction *autoScore = [SKAction runBlock:^{ 
    [self adjustScoreBy:1]; 
    }]; 

    NSTimeInterval duration = 0.25; 
    SKAction *slice = [SKAction sequence:@[[SKAction waitForDuration:duration], autoScore]]; 
    SKAction *repeat = [SKAction repeatAction:slice count:self.fieldDescriptor.duration/duration - 1]; 
    [self runAction:repeat withKey:@"autoScore"]; 
} 

- (void)stopAutoScore { 
// [self removeActionForKey:@"autoScore"]; 
} 

Edit 2: Я подтвердил, что инструменты, когда метод stopAutoScore выполняется, последняя оставшаяся ссылка на используемом SKScene удаляются и старая сцена правильно освобождаться.

+0

Можете ли вы обновить вопрос с помощью фактического кода (той части, которая, по вашему мнению, имеет значение), просто для полноты, так как это более вероятно, что вы получите лучший ответ. – Whirlwind

+0

Я не знаю, какая часть моего кода является важной частью. Посмотрите первое изображение. Он разбивается на 'main()', а трассировка стека - это unsymbolized машинный код, внутренний для 'SpriteKit'. Я хотел бы иметь некоторый код, связанный с ним. – bshirley

+0

@whirlwind я добавил некоторый код, но не верю, что это вызывает проблему, скорее скрывая ее, когда сцена «останавливается раньше», а код не закомментирован, произойдут сбои – bshirley

ответ

0

У меня есть ток (меньше идеала) обходной способ.

Если преобразовать переход из особенно сложной SKScene в прямой presentScene:

от:

SKTransition *transition = [SKTransition fadeWithColor:[SKColor whiteColor] duration:1.0]; 
[self.view presentScene:scene transition:transition]; 

к:

[self.view presentScene:scene]; 

и если я явно удалить все дети со сцены, подлежащие замене до я называю «» presentScene

[self removeAllChildren]; 

Затем сбои (которые были недетерминированными, но часто, происхожу по крайней мере, на 4-й такого перехода) останавливается.

Учитывая, что я считаю эту ошибку внутренней для SpriteKit, или каким-то образом я неправильно использую спрайты. Я хотел бы получить правильный ответ.