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

单位数据库.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"];三行,例如

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

这将允许您查明哪个调用发出了EXC_BAD_ACCESS,如果您愿意,您可以在之后将它们折叠回来。

在您确定哪一行发出错误之后,通常需要找到您没有调用的地方[[MyClass alloc] init];。例如,如果getGameScenegetUnitDatabase返回不是alloc'd/ init'd 的对象(或者delegate同样如此),那么您要确保至少在返回它们之前这样做。

如果没有看到更多代码,我就无能为力了,但是这些错误通常是这样的。确保分配并初始化作为其他对象成员保留的对象。

于 2012-05-23T20:17:01.063 回答
1

看起来你还没有分配或初始化unit。尝试更改Unit *unit;为:

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

添加,当然,如果您不使用 ARC,请确保释放/自动释放。

于 2012-05-23T19:57:23.180 回答
1

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

于 2012-05-23T20:05:33.183 回答
0

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

于 2012-05-23T21:11:51.397 回答