gpt4 book ai didi

iphone - 我得到了一个 EXC_BAD_ACCESS,我似乎无法找出原因

转载 作者:行者123 更新时间:2023-11-29 11:14:23 25 4
gpt4 key购买 nike

所以这是理解我的问题所需的背景代码。在我的 View Controller 类中,我有一个方法创建一个名为 levelStart 的数组,然后将该数组发送到我的游戏类,该类使用该数组初始化自身,然后我有一组使用该数组“玩游戏”的函数.这是 View Controller 代码:

    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];

在我的游戏类中,这是初始化方法:

-(id)initLevel:(int)aLevel With:(NSMutableArray*)starter AndFinish:(NSMutableArray*)finisher WithRows:(int)rows WithColumns:(int)cols WithControl:(Coord)aControlSquare{
self = [super init];
if (self != nil){
level = aLevel;
squares = [[NSMutableArray alloc] init];
squares = starter;
finish = [[NSMutableArray alloc] init];
finish = finisher;
}
return self;
}

现在一直卡住的方法是在Game里面,由UIgesture recognizer触发,这里是卡住的那一行:

 if ([[self squareForCoord:test] intValue] == 8) {
...
}

其中 squareForCord 获取测试坐标并返回该坐标处的 NSNumber。所以我确保我所有的测试都在范围内,并且它卡住的点在我的数组范围内。我相信我正在正确初始化所有内容,但显然不是,这绝对不是发布已发布内容的问题,所以我认为这一定是初始化问题,请帮忙。

最佳答案

您的代码中存在一些问题,但我没有看到 EXC_BAD_ACCESS 源,但我有一些关于查找它的建议。

在此之前——这里有一些您可能想要修复的其他问题

  1. 如果你像这样初始化本地字符串

    NSString* startString = @"9999999999988888888998888888899888888889988888888998888888899888888889911888888991188888899999999999";

    没有必要释放它们。这使您更有可能正确地做到这一点。

  2. 迭代字符时,不要硬编码长度。使用字符串的长度

    for (int i = 0; i < [startString length]; i++) {
  3. 你所有的 if block 都是这样

    if (currentsquare == 1) {
    NSNumber* numb1 = [[NSNumber alloc] initWithInt:1];
    [levelStart addObject:numb1];
    }

    可以通过这样做来代替(但是,请先阅读#4)

    NSNumber* numb1 = [[NSNumber alloc] initWithInt:currentsquare];
    [levelStart addObject:numb1];

    无需检查每个可能的数字

  4. 上面的代码泄露了,所以真的应该是这样的

    NSNumber* numb1 = [NSNumber numberWithInt:currentsquare];
    [levelStart addObject:numb1];

    无论何时分配,您都可能需要释放,除非您将责任转嫁给其他人。如果您阅读 addObject 文档,您会看到它调用了 retain,因此它不对您的发布承担责任。在这种情况下,numberWithInt 返回一个自动释放的对象。

  5. 这段代码

    squares = [[NSMutableArray alloc] init];
    squares = starter;

    立即泄漏第一个数组。您将 squares 设置为一个数组对象,然后设置为另一个完全不同的对象。对第一个的引用丢失了。应删除第一行(与 finish 类似)。

如果这是一个新项目,那么我会建议您立即将其转换为 ARC。这将使处理内存变得更加容易。

但是,如果由于某种原因您不能,请阅读我写的这篇解释 EXC_BAD_ACCESS 的博客:

http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

简要(阅读后)这是我建议你做的

  1. 运行分析并修复它发现的每一个错误。它使用与 ARC 相同的算法,它指出的每个错误很可能都是真正的问题(它会指出上面的问题 #4 和 #5)

  2. 打开僵尸。我知道您认为您没有向已释放的对象发送消息,并且上面的代码中没有任何实例,但根据我所看到的,我认为很可能存在。僵尸是一个保留计数为零的对象。当僵尸被打开时,这些对象不再被释放,而是当你向它们发送消息时它们只会提示。

如果这样做后找不到问题,请查看博客中的其他建议。

关于iphone - 我得到了一个 EXC_BAD_ACCESS,我似乎无法找出原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10128463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com