大丈夫、私は私を困惑させました。私は答えを探すためにいくつかのことをしたが、私が見つけたものは何も明らかにしていない。私が関連する答えを見逃してしまった場合は、私の謝罪を受け入れ、私に正しい方向を教えてください。それは...cocos2dを使ったinitメソッド内のEXC_BAD_ACCESS
私の問題は、通常、メモリが解放されたオブジェクトで何かをしようとすることによって引き起こされる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
...そして、スーパークラスのinitメソッド
- (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;
}
すべてのヘルプまたは一般的なアドバイスをいただければ幸いです。事前にトンをありがとう!
私たちはそれがクラッシュしている場所の例を教えてください。 – JeremyP
Doh!私はそれを男から見出し、率直に言って私は恥ずかしいです。問題は、スーパークラスのinitメソッドから自分自身を返さないということです。その行が問題を解決したと付け加えました。助けてくれてありがとう! – Wynn
ああ、そうだったはずだ。この質問に対する回答を作成し、それを受け入れる必要があります。 – JeremyP