Хорошо, ребята, у меня есть тот, который сбил меня с толку. Я немного искал ответ, но ничего, что я нашел, ничего не прояснило. Если я пропустил соответствующий ответ, примите мои извинения и укажите мне правильное направление. Тем не менее ...
Моя проблема - ошибка exc_bad_access, которая, как я знаю, обычно вызывается попыткой что-то сделать с объектом, у которого была освобождена память. Однако мое замешательство связано с тем фактом, что когда я пытаюсь создать экземпляр слоя (с помощью метода init), как только я пытаюсь установить любое из значений классов, возникает ошибка, о которой идет речь. Спрайт является членом суперкласса ... суперкласс наследуется от CCLayer. Почему говорится, что я пытаюсь получить доступ к памяти, которая была освобождена, когда мой слой был явно только что создан и для него выделена память? Есть ли решение, чтобы избавиться от этого сообщения об ошибке? Возможно, есть какая-то особенность наследования в цели c, о которой я не знаю?
Вот соответствующие методы из слоя, который я пытаюсь создать:
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
//note that i allocate and initialize the object just like any other object
//I've also tried retain here
MainGameLayer *layer = [[MainGameLayer alloc] init];
layer = [MainGameLayer node];
HUD *hudLayer = [[HUD alloc] initWithLayer:layer];
[scene addChild:hudLayer z:1];
[scene addChild:layer];
return scene;
}
-(id) init {
//will call the init method shown below
if (self=[super init]) {
//program crashes right here on this line with exc_bad_access
centerBackground = [CCSprite spriteWithFile:@"background.png"];
centerBackground.position = ccp(240, 160);
[self addChild:centerBackground];
eastBackground = [CCSprite spriteWithFile:@"background.png"];
eastBackground.position = ccp(752, 160);
[self addChild:eastBackground];
westBackground = [CCSprite spriteWithFile:@"background.png"];
westBackground.position = ccp(-272, 160);
[self addChild:westBackground];
northBackground = [CCSprite spriteWithFile:@"background.png"];
northBackground.position = ccp(240, 672);
[self addChild:northBackground];
southBackground = [CCSprite spriteWithFile:@"background.png"];
southBackground.position = ccp(240, -352);
[self addChild:southBackground];
}
return self
}
Вот интерфейс для суперкласса, от которого наследуется мой слой:
@interface GamePlayLayer : CCLayer <UIAccelerometerDelegate> {
UIAccelerometer *accelerometer;
float xAccelerationFactor;
float yAccelerationFactor;
float zAccelerationFactor;
CCSprite *centerBackground;
CCSprite *eastBackground;
CCSprite *westBackground;
CCSprite *southBackground;
CCSprite *northBackground;
CCSprite *southWestBackground;
CCSprite *southEastBackground;
CCSprite *northWestBackground;
CCSprite *northEastBackground;
}
@property (nonatomic, retain) UIAccelerometer *accelerometer;
@property float xAccelerationFactor;
@property float yAccelerationFactor;
@property float zAccelerationFactor;
@end
... И метод инициализации суперкласса
- (id) init {
//note that this init finishes with no problems
xAccelerationFactor = 0;
yAccelerationFactor = 0;
zAccelerationFactor = 0;
self.accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer.updateInterval = .1;
self.accelerometer.delegate = self;
}
Любая помощь или общие советы приветствуются. Большое спасибо заранее!