xcode中的EXC_BAD_ACCESS试图从另一个类调用一个方法

时间:2012-05-23 19:36:30

标签: objective-c xcode cocos2d-iphone

您好,我在我的代码中遇到了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 个答案:

答案 0 :(得分:2)

好的,首先将电话[[[delegate getGameScene] getUnitDatabase] createUnit:@"t01"];分开三行,例如

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

这样您就可以确定哪个号码会发出EXC_BAD_ACCESS,如果您愿意,可以将其折回。

在确定哪一行发出错误之后,通常需要找到您未调用[[MyClass alloc] init];的位置。例如,如果getGameScenegetUnitDatabase返回的对象不是alloc'd / init'd(或delegate),那么你想确保至少在你归还之前做到这一点。

如果没有看到更多代码,我无法提供更多帮助,但这些错误通常都是这样的。确保分配并初始化您保留的对象作为其他对象的成员。

答案 1 :(得分:1)

您似乎尚未分配或初始化unit。尝试将Unit *unit;更改为:

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

添加,当然如果您不使用ARC,请务必发布/自动发布。

答案 2 :(得分:1)

此外,作为未来的参考,每当遇到类似try的内容时,请尝试识别导致错误的特定代码行。在这种情况下,我很确定不是你的PurchaseTowerMenuLayer.m存在问题 - 这是createUnit方法中的内容。即使这样也可能不够准确 - 它可能是十级深度的系统调用。在寻求帮助之前,你应该尝试找出类似的东西 - 在很多情况下,它会帮助你自己找到答案。而且早点。

答案 3 :(得分:0)

编辑您的方案并启用NSZombie以获得更明确的错误