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?
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.
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
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
@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