2015-09-03 1 views
2

Je suis victime d'un accident causé par EXC_BAD_ACCESS. Il n'est pas détecté en définissant le NSZombieEnabled sur YES, indiquant qu'il ne s'agit pas d'un objet libéré. (garçon, est-ce que je souhaite vraiment que c'était)EXC_BAD_ACCESS Transition de scènes SpriteKit, pas de zombies

La trace de la pile est moins utile (pour moi). Est-ce que quelqu'un y voit un aperçu?

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  

Autre contexte:

application SpriteKit qui est en train de passer à une nouvelle scène. La nouvelle scène est initialement affichée, mais l'accident se produit tout de suite.

Il y a une action sur les scènes entrantes et sortantes. Ces actions contiennent un bloc qui référence la scène. Les scènes fuyaient et ce bloc semblait être l'un des délinquants. Lorsque j'ai ajouté du code pour supprimer l'action, ce crash est apparu.

Xcode 6.4 iPad Air, iOS 8.4.1


Edit 1: Ce code existe sur chaque SKScene. Lorsque la deuxième méthode est commentée, il cache le problème (je crois en aidant la fuite).

- (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: J'ai confirmé avec des instruments que lorsque la méthode stopAutoScore est exécutée, la dernière référence restant à utiliser SKScene est enlevé et l'ancienne scène est correctement désallouée.

+0

Pouvez-vous mettre à jour une question avec le code réel (la partie que vous pensez qu'elle est pertinente), juste pour l'exhaustivité, car de cette façon, il est plus probable que vous obtiendrez une meilleure réponse. – Whirlwind

+0

Je ne peux pas savoir quelle partie de mon code est la partie saillante. Voir la première image Il se casse dans 'main()', et la trace de la pile est un code machine non symbolisé interne à 'SpriteKit'. J'aimerais avoir du code associé. – bshirley

+0

@whirlwind J'ai ajouté du code mais je ne crois pas que cela cause le problème, mais je le cache, quand la scène "s'arrête tôt" et que le code n'est pas commenté, les plantages se produisent – bshirley

Répondre

0

J'ai un courant (moins qu'idéale) solution de contournement.

Si je convertir la transition de la SKScene particulièrement complexe dans un presentScene: droit

de:

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

à:

[self.view presentScene:scene]; 

et si je retire explicitement tous les les enfants de la scène sur le point d'être remplacés avant j'appelle le « presentScene »

[self removeAllChildren]; 

Ensuite, les accidents (qui étaient non-déterministe, mais commune, se produisant au moins par la 4ème telle transition) arrêt. Etant donné cela, je considérerais cela comme un bug interne à SpriteKit, ou d'une manière ou d'une autre, je n'arrive pas à gérer les sprites. J'aimerais avoir une réponse correcte.