1

こんにちは、コードで EXC_BAD_ACCESS に遭遇しました。

クラス PurchaseTowerMenuLayer でメソッドを実行しようとしています。メソッドはクラス UnitDatabase からのものです。

PurchaseTowerMenuLayer.m:

delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
// getUnitDatabase returns UnitDatabase class from GameScene class

[[[delegate getGameScene] getUnitDatabase] createUnit:@"t01"]; //EXC_BAD_ACCESS happens here

UnitDatabase.m:

-(void)createUnit:(NSString *)unitID
{

typeString = [unitID substringWithRange:NSMakeRange(0,1)];
numberString = [unitID substringWithRange:NSMakeRange(1,2)];

Unit *unit;

if(unitID == @"t00")
    [unit setUnitID:unitID];

etc...
}

このエラーを取得するために何をしていますか? どのように見えるべきですか?

前もって感謝します!

4

4 に答える 4

2

[[[delegate getGameScene] getUnitDatabase] createUnit:@"t01"];よし、まず次のような 3 行の呼び出しを分離する

GameScene* scene = [delegate getGameScene];
UnitDatabase* unitDatabase = [scene getUnitDatabase];
[unitDatabase createUnit:@"t01"];

これにより、どの呼び出しが を発行したかを特定でき、必要EXC_BAD_ACCESSに応じてそれらを元に戻すことができます。

どの行でエラーが発生したかを特定したら、通常、呼び出していない場所を見つけるだけです[[MyClass alloc] init];。たとえば、'd/ 'd されていない (またはgetGameSceneその点でも)getUnitDatabaseオブジェクトを返す場合は、少なくともそれらを返す前に必ずそれを行う必要があります。allocinitdelegate

もっと多くのコードを見ない限り、これ以上のことはできませんが、これらのエラーはしばしば次のようになります。他のオブジェクトのメンバーとして保持するオブジェクトを割り当てて初期化してください。

于 2012-05-23T20:17:01.063 に答える
1

を割り当てていないか、初期化していないようですunit。次のように変更Unit *unit;してみてください。

Unit *unit = [[Unit alloc] init];

もちろん、ARCを使用していない場合は、リリース/自動リリースを確認してください。

于 2012-05-23T19:57:23.180 に答える
1

また、今後の参考として、try などのエラーが発生した場合は、エラーが発生した特定のコード行を特定してみてください。この場合、問題があるのはあなたではないと確信しています-それはメソッドPurchaseTowerMenuLayer.m内の何かです。createUnitそれでもおそらく十分に正確ではないでしょう - それは 10 レベルの深さのシステム コールかもしれません。助けを求める前に、そのようなことを特定するようにしてください。多くの場合、自分で答えを見つけるのに役立ちます。そしてもっと早く。

于 2012-05-23T20:05:33.183 に答える
0

スキームを編集し、より明示的なエラーに対して NSZombie を有効にします

于 2012-05-23T21:11:51.397 に答える