您好,我在我的代码中遇到了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...
}
我该怎么做才能收到此错误?应该怎么样?
提前致谢!
答案 0 :(得分:2)
好的,首先将电话[[[delegate getGameScene] getUnitDatabase] createUnit:@"t01"];
分开三行,例如
GameScene* scene = [delegate getGameScene];
UnitDatabase* unitDatabase = [scene getUnitDatabase];
[unitDatabase createUnit:@"t01"];
这样您就可以确定哪个号码会发出EXC_BAD_ACCESS
,如果您愿意,可以将其折回。
在确定哪一行发出错误之后,通常需要找到您未调用[[MyClass alloc] init];
的位置。例如,如果getGameScene
或getUnitDatabase
返回的对象不是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以获得更明确的错误