Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我得到了一个坏的EXC\u访问,我似乎无法找到原因_Iphone_Objective C_Ios_Ios4 - Fatal编程技术网

Iphone 我得到了一个坏的EXC\u访问,我似乎无法找到原因

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

下面是理解我的问题所需的背景代码。在我的视图控制器类中,我有一个创建一个名为levelStart的数组的方法,然后该数组被发送到我的游戏类,该类使用该数组初始化自己,然后我有一组函数使用该数组“玩游戏”。 以下是视图控制器代码:

    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类似)

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

    但是,如果您因某种原因不能访问,请阅读我写的解释EXC_BAD_访问的博客:

    简单地说(看完后)以下是我建议你做的

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

  • 打开僵尸。我知道您认为您没有向发布的对象发送消息,并且上面的代码中没有任何实例,但是根据我看到的,我认为很可能有。僵尸是保留计数为零的对象。当僵尸打开时,这些对象不再被释放,而是在您向它们发送消息时发出抱怨


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

    首先,您是否在第一个类实现中发布过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];