Iphone 我得到了一个坏的EXC\u访问,我似乎无法找到原因
下面是理解我的问题所需的背景代码。在我的视图控制器类中,我有一个创建一个名为levelStart的数组的方法,然后该数组被发送到我的游戏类,该类使用该数组初始化自己,然后我有一组函数使用该数组“玩游戏”。 以下是视图控制器代码:Iphone 我得到了一个坏的EXC\u访问,我似乎无法找到原因,iphone,objective-c,ios,ios4,Iphone,Objective C,Ios,Ios4,下面是理解我的问题所需的背景代码。在我的视图控制器类中,我有一个创建一个名为levelStart的数组的方法,然后该数组被发送到我的游戏类,该类使用该数组初始化自己,然后我有一组函数使用该数组“玩游戏”。 以下是视图控制器代码: NSMutableArray* levelStart = [[NSMutableArray alloc] init]; NSMutableArray* levelFinish = [[NSMutableArray alloc] init]; NS
NSMutableArray* levelStart = [[NSMutableArray alloc] init];
NSMutableArray* levelFinish = [[NSMutableArray alloc] init];
NSString* startString = [[NSString alloc] initWithString:@"9999999999988888888998888888899888888889988888888998888888899888888889911888888991188888899999999999"];
NSString* finishString = [[NSString alloc] initWithString:@"9999999999988888811998888881199888888889988888888998888888899888888889988888888998888888899999999999"];
int currentsquare;
for (int i = 0; i < 100; i++) {
currentsquare = [startString characterAtIndex:i] - '0';
if (currentsquare == 1) {
NSNumber* numb1 = [[NSNumber alloc] initWithInt:1];
[levelStart addObject:numb1];
}
if (currentsquare == 2) {
NSNumber* numb2 = [[NSNumber alloc] initWithInt:2];
[levelStart addObject:numb2];
}
if (currentsquare == 3) {
NSNumber* numb3 = [[NSNumber alloc] initWithInt:3];
[levelStart addObject:numb3];
}
if (currentsquare == 4) {
NSNumber* numb4 = [[NSNumber alloc] initWithInt:4];
[levelStart addObject:numb4];
}
if (currentsquare == 8) {
NSNumber* numb8 = [[NSNumber alloc] initWithInt:8];
[levelStart addObject:numb8];
}
if (currentsquare == 9) {
NSNumber* numb9 = [[NSNumber alloc] initWithInt:9];
[levelStart addObject:numb9];
}
}
for (int i = 0; i < 100; i++) {
currentsquare = [finishString characterAtIndex:i] - '0';
if (currentsquare == 1) {
NSNumber* fnumb1 = [[NSNumber alloc] initWithInt:1];
[levelFinish addObject:fnumb1];
}
if (currentsquare == 2) {
NSNumber* fnumb2 = [[NSNumber alloc] initWithInt:2];
[levelFinish addObject:fnumb2];
}
if (currentsquare == 3) {
NSNumber* fnumb3 = [[NSNumber alloc] initWithInt:3];
[levelFinish addObject:fnumb3];
}
if (currentsquare == 4) {
NSNumber* fnumb4 = [[NSNumber alloc] initWithInt:4];
[levelFinish addObject:fnumb4];
}
if (currentsquare == 8) {
NSNumber* fnumb8 = [[NSNumber alloc] initWithInt:8];
[levelFinish addObject:fnumb8];
}
if (currentsquare == 9) {
NSNumber* fnumb9 = [[NSNumber alloc] initWithInt:9];
[levelFinish addObject:fnumb9];
}
}
[startString release];
[finishString release];
//NOTE: I took out the intialization of control and level, both which work fine.
myGame = [[Game alloc] initLevel:level With:levelStart AndFinish:levelFinish WithRows:10 WithColumns:10 WithControl:control];
现在,它保持冻结状态的方法在游戏中,由UI手势识别器触发,下面是它冻结的行:
if ([[self squareForCoord:test] intValue] == 8) {
...
}
其中,squareForCord接受测试坐标并返回该坐标处的NSNumber。因此,我确保所有测试都在边界内,它冻结的点在数组的边界内。我相信我初始化的一切都是正确的,但显然不是,发布发布的东西肯定没有问题,所以我想这一定是初始化问题,请帮助。您的代码中有一些问题,但我没有看到EXC\u BAD\u访问源,但我有一些关于查找它的建议 在此之前,这里有一些您可能需要解决的其他问题
NSString* startString = @"9999999999988888888998888888899888888889988888888998888888899888888889911888888991188888899999999999";
if (currentsquare == 1) {
NSNumber* numb1 = [[NSNumber alloc] initWithInt:1];
[levelStart addObject:numb1];
}
没有必要释放它们。这使您更有可能正确地执行此操作for (int i = 0; i < [startString length]; i++) {
可以通过这样做来代替(但是,请先阅读#4)
无需检查每个可能的号码NSNumber* numb1 = [NSNumber numberWithInt:currentsquare];
[levelStart addObject:numb1];
无论何时,你都可能需要释放,除非你把责任转嫁给其他人。如果您阅读addObject
文档,您将看到它调用了retain,因此它不承担发布的责任。在本例中,numberWithInt返回一个自动删除的对象squares = [[NSMutableArray alloc] init];
squares = starter;
立即泄漏第一个阵列。将正方形设置为一个阵列对象,然后设置为一个完全不同的阵列对象。对第一个的引用丢失。应删除第一行(与finish类似)如果这样做后仍然找不到问题,请查看博客中的其他建议。首先,您是否在第一个类实现中发布过levelStart和levelFinish数组?如果是这样的话,这是一个明显的问题,因为在实例化第二个类之后,您没有保留这些对象。我的建议是使用属性将数组保存在第二个类中。差不多
@property (nonatomic, retain) NSMutableArray *squares;
@property (nonatomic, retain) NSMutableArray *finish;
在您的声明中,然后是:
@synthesize squares, finish;
在.m文件中,然后在初始值设定项中进行如下赋值:
self.squares = starter;
self.finish = finisher;
现在,新类中有一个保留副本。我也会考虑使用:
myGame = [[Game alloc] initLevel:level With:[ levelStart autorelease ] AndFinish:[levelFinish autorelease] WithRows:10 WithColumns:10 WithControl:control];
为了提高可读性。另外,我会考虑使用ARC来避免这些问题。你能在崩溃的周围添加更多的上下文吗?显示测试来自何处,以及squareForCoord的内容?您还可以将其拆分为两个调用,以查看崩溃的是[self squareForCoord:test]还是[XXXX intValue]。最后,这部分看起来很奇怪:squares=[[NSMutableArray alloc]init];正方形=起动器;。分配一个数组,然后用另一个数组替换它。我认为您的意图是复制数组,但您的代码没有这样做。完整的错误消息是什么?您应该能够使用
NSZombie
来找出原因:好的,因此,数组的每个部分都会调用first off squareForCoord,因为每个方块的信息必须在,intValue不是问题,因为NSNumber不应该与intValue有问题。现在数组在初始化时被设置为正方形,因为它必须在初始化后显示。在崩溃中没有错误,但游戏“暂停”,它在调试器窗口中显示llbd,出现了一条绿线,显示EXC_BAD_access谢谢你,我将通过我的代码修复漏洞,我将立即进行分析,并希望找出问题,所以我通过分析,修复了一些错误,但只有一个,我不知道,所以在我的initalize方法中有另一个数组isMovable,我这样设置它:isMovable=[self-createIsMovable];createIsMovable我分配了一个数组,就是我想要返回的数组,我应该自动释放它吗?Analyze不知道返回是由调用方释放的。它从命名约定中获取信息——调用消息newIsMovable
,它就会理解。调用方负责在某个点释放它。或者,让它保持原样,并自动恢复返回。在这种情况下,调用方必须立即保留;[levelStart addObject:numb1]代码>仅`[levelStart addObject:[NSNumber numberWithInt:currentsquare]];代码越少越好:-)所以在我的游戏初始化过程中,我做了类似isMovable=[[self-createIsMovable]retain]的事情;或isMovable=[自创建isMovable];[可更改];还有广告
self.squares = starter;
self.finish = finisher;
myGame = [[Game alloc] initLevel:level With:[ levelStart autorelease ] AndFinish:[levelFinish autorelease] WithRows:10 WithColumns:10 WithControl:control];