0

大丈夫、私は私を困惑させました。私は答えを探すためにいくつかのことをしたが、私が見つけたものは何も明らかにしていない。私が関連する答えを見逃してしまった場合は、私の謝罪を受け入れ、私に正しい方向を教えてください。それは...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; 
} 

すべてのヘルプまたは一般的なアドバイスをいただければ幸いです。事前にトンをありがとう!

+0

私たちはそれがクラッシュしている場所の例を教えてください。 – JeremyP

+0

Doh!私はそれを男から見出し、率直に言って私は恥ずかしいです。問題は、スーパークラスのinitメソッドから自分自身を返さないということです。その行が問題を解決したと付け加えました。助けてくれてありがとう! – Wynn

+0

ああ、そうだったはずだ。この質問に対する回答を作成し、それを受け入れる必要があります。 – JeremyP

答えて

0

警告を吐き出す必要があります。このコードは、 "コントロールが非void型関数の終わりに到達した":

- (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; 
} 

ますinitを宣言してid型の値を返します。あなたは何も返しません。そして、あなたはその何を使用していないし、ここselfに割り当て:非返された値は、単にnilある最良の場合には

if (self=[super init]) { 

。しかし、それはクラッシュしません。だから私は2つの事のうちの1つが起こっているとします:

  • 自己はランダム値で初期化されていません。
  • selfはスタックからの戻り値で初期化されますが、実際に値を返すことはないので、戻り値は単なる値です。

あなたは何をしているのかわからない限り、警告を無視しないでください。ビルド設定で「警告をエラーとして扱う」をオンにすると、かなり有益な懲戒措置となります。 :)

0

MainGameLayer *layerを2回設定しました。最初のallocは必要ではなく、解放されていないのでメモリをポップします。

変更この:これに

MainGameLayer *layer = [[MainGameLayer alloc] init]; 
layer = [MainGameLayer node]; 

MainGameLayer *layer = [MainGameLayer node]; 
+0

なぜ私はメモリリークのために、そしてinitが2回呼び出されるという事実のためにその変更を行うべきであると思うのですが、残念ながら、これは私の問題を解決するようには見えませんでした(同じ場所で同じエラーが発生しています)。 – Wynn

関連する問題