EXC_BAD_ACCESS пытается получить доступ к пользовательским данным тела Box2D

Как предложено в руководстве по Box2D, я устанавливаю свое тело->userData на CCSprite, связанный с ним. Однако, когда я позже пытаюсь получить к нему доступ - даже в том же методе или в том же цикле for - он неизбежно генерирует EXC_BAD_ACCESS.

Ошибка появляется каждый раз, когда появляется следующая структура кода:

b2BodyDef bodyDef;
b2Body* blockBody;
Block* block;

//...

block = [Block spriteWithFile:spriteName];

//Block configuration
block.position = CGPointMake(x.floatValue * BLOCK_SIZE_PIXELS, y.floatValue * BLOCK_SIZE_PIXELS);        
block.anchorPoint = CGPointZero;
[self addChild:block z:7]; 
[self.blockArray addObject:block];

//Body configuration
bodyDef.type = b2_dynamicBody;
bodyDef.position = toMeters(block.position);
bodyDef.angle = 0.0f;
bodyDef.linearDamping = 1.0f;
bodyDef.angularDamping = 0.0f;
bodyDef.gravityScale = 1.0f;
bodyDef.allowSleep = true;
bodyDef.awake = true;
bodyDef.fixedRotation = true;
bodyDef.userData = █

blockBody = world->CreateBody(&bodyDef);

vertices[0] = toMeters(CGPointZero);  
vertices[1] = toMeters(CGPointMake(BLOCK_SIZE_PIXELS, 0));
vertices[2] = toMeters(CGPointMake(BLOCK_SIZE_PIXELS, BLOCK_SIZE_PIXELS));
vertices[3] = toMeters(CGPointMake(0, BLOCK_SIZE_PIXELS));

blockShape.Set(vertices, 4);

fixtureDef.shape = &blockShape;
fixtureDef.density = 1.0f;
blockFixture = blockBody->CreateFixture(&fixtureDef);

block.body = blockBody;


//UPON INVOKING THIS LINE,
//PROGRAM CRASHES WITH EXCEPTION: EXC_BAD_ACCESS
Block* test = (__bridge Block*)blockBody->GetUserData();

Этот код появляется в loadlevel: в GameLayer.m, который наследуется от CCLayer.

Block наследуется от GameSprite, который определяет .body и наследуется от CCSprite. Заголовочные файлы:

//
//  Block.h
//
//  Created by [REDACTED] on 7/20/12.
//  Copyright (c) 2012 [REDACTED]. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "GameSprite.h"
//#import "Constants.h"

@interface Block : GameSprite
{
//    GameSprite* _sprite;
//    int _platformTag;
}

+(Block*) blockWithFile: (NSString*) filename;
+(Block*) blockWithTexture: (CCTexture2D*) texture;
@end

//
//  GameSprite.h
//  LegendaryOiramBrothers
//
//  Created by [REDACTED] on 7/20/12.
//  Copyright (c) 2012 [REDACTED]. All rights reserved.
//

#import "CCSprite.h"
#import "Constants.h"
#import "Box2D.h"

@interface GameSprite : CCSprite
{
    b2Body* body;
}

- (void) update;

- (void) setPosition:(CGPoint)position;
- (b2Vec2) getVelocity;
- (void) setVelocity:(b2Vec2) vel;

@property (nonatomic) b2Body* body;

@end

Судя по тому, что я могу найти в Интернете, моя проблема, кажется, где-то в неправильном автоматическом выпуске, но я не вижу, где у блока была бы возможность освободить его. В результате я довольно запутался.

Спасибо за вашу помощь.

1 ответ

Решение

Можете ли вы определить ошибку в этой строке?

bodyDef.userData = &block;

Вы назначаете адрес указателя, а не сам указатель. Это должно исправить это:

bodyDef.userData = block;
Другие вопросы по тегам