EXC_BAD_ACCESS SKPhysicsWorld

Estoy realmente confundido sobre por qué obtengo un EXC_BAD_ACCESS (código = 1, dirección = 0x1c) en [world addJoint: pinJoin] ;.

JointTest.m

#import "JointTest.h" @implementation JointTest -(SKNode *)initWithWorld:(SKPhysicsWorld *)pWorld{ if(self = [super init]){ world = pWorld; [self attachBodies]; } return self; } -(void)attachBodies{ SKSpriteNode * spriteA = [[SKSpriteNode alloc]initWithImageNamed:@"rocket"]; SKSpriteNode * spriteB = [[SKSpriteNode alloc]initWithImageNamed:@"rocket"]; SKPhysicsBody * bodyA = [SKPhysicsBody bodyWithRectangleOfSize:spriteA.size]; SKPhysicsBody * bodyB = [SKPhysicsBody bodyWithRectangleOfSize:spriteB.size]; spriteA.position = CGPointMake(150, 300); spriteB.position = CGPointMake(150, 300 + spriteB.size.height/2); [self addChild:spriteA]; [self addChild:spriteB]; bodyA.dynamic = NO; spriteA.physicsBody = bodyA; spriteB.physicsBody = bodyB; SKPhysicsJointPin * pinJoin = [SKPhysicsJointPin jointWithBodyA:spriteA.physicsBody bodyB:spriteB.physicsBody anchor:spriteA.position]; [world addJoint:pinJoin]; } @end 

JointTest.h

 #import <SpriteKit/SpriteKit.h> @interface JointTest : SKNode{ SKPhysicsWorld * world; } -(SKNode *)initWithWorld:(SKPhysicsWorld *)pWorld; @end 

En el SKScene

 JointTest * test = [[JointTest alloc]initWithWorld:self.physicsWorld]; [self addChild:test]; 

Lo que me confunde es mover el código en el método attachBodies a la escena y llamar al método addJoint con el físico de la escena. El mundo funciona de maravilla. Por ejemplo:

 SKSpriteNode * spriteA = [[SKSpriteNode alloc]initWithImageNamed:@"rocket"]; SKSpriteNode * spriteB = [[SKSpriteNode alloc]initWithImageNamed:@"rocket"]; SKPhysicsBody * bodyA = [SKPhysicsBody bodyWithRectangleOfSize:spriteA.size]; SKPhysicsBody * bodyB = [SKPhysicsBody bodyWithRectangleOfSize:spriteB.size]; spriteA.position = CGPointMake(150, 300); spriteB.position = CGPointMake(150, 300 + spriteB.size.height/2); [self addChild:spriteA]; [self addChild:spriteB]; bodyA.dynamic = NO; spriteA.physicsBody = bodyA; spriteB.physicsBody = bodyB; SKPhysicsJointPin * pinJoin = [SKPhysicsJointPin jointWithBodyA:spriteA.physicsBody bodyB:spriteB.physicsBody anchor:spriteA.position]; [self.physicsWorld addJoint:pinJoin]; 

Me he estado tirando el pelo por algunas horas sobre esto, así que si alguien tiene una idea, lo agradecería mucho. ¡Gracias!

Pasar el mundo de la física en init no es un buen layout. En su lugar, cree la instancia de la class normalmente, luego envíe el post attachBodies desde donde creó la instancia de JointTest. Entonces puedes acceder al mundo de la física a través de self.scene.physicsWorld lugar de tener que pasar por el mundo y mantener una reference extraña a él.

En lugar de esto:

 JointTest * test = [[JointTest alloc]initWithWorld:self.physicsWorld]; [self addChild:test]; 

Hacer esto:

 JointTest * test = [JointTest node]; [self addChild:test]; [test attachBodies]; 

Tenga en count que attachBodies se envía después de addChild porque antes de agregarChild la propiedad de scene de JointTest seguirá siendo nula.

Apuesto a que esto también resolverá tu problema, aunque esto es una suposition :

Cree JointTest e inmediatamente agregue dos sprites con juntas, pero en este punto la instancia de JointTest aún no se agrega al gráfico de nodo (a través de addChild). Por lo tanto, JointTest y sus dos nodos secundarios aún no están "registrados" con el mundo de la física, lo que puede conducir a la falla.