Objective C代码调试问题

时间:2013-06-19 20:55:30

标签: objective-c debugging readfile gnustep

我正在尝试编译并运行一个简单的目标c代码但我在Windows上这样做。我正在使用GNU Step,我很难调试它并了解运行时的情况。我是一个.NET开发人员和我总是使用Visual Studio中的调试器来跟踪数据流和stuf,但这里......真的很烦人。我没有Mac Book,所以我也没有XCode。

有人可以告诉我代码安静的问题是什么?这很简单,如果有Mac的人可以为我调试它并告诉我什么是错误的话会很棒。

代码的想法是它逐行读出一个文本文件,然后在每3行代码中创建一个NSMutableArray的Object并将它添加到另一个NSMutableArray。它是:

read_line函数:

int read_line(FILE *in, char *buffer, size_t max)
{
  return fgets(buffer, max, in) == buffer;
}

文本文件的内容:

Sophie Ellis-Bextor
71222
5.01

Inna Morales
61223
6.00

Kortez Domingues
41231
3.25

主要代码:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    FILE *in;
        if((in = fopen("C:...\\Input.txt", "rt")) != NULL)
        {
            char line[256];

            NSMutableArray* resultArray     = [[NSMutableArray alloc] init];

            while(read_line(in, line, sizeof line))
            {
            NSString *currentLine = [[NSString alloc] initWithUTF8String:line]; 
            [resultArray addObject:currentLine];
            }

            NSMutableArray*resultObjectsArray =[[NSMutableArray alloc] init];
            NSMutableArray*tmpArray =[[NSMutableArray alloc] init];

            for(int i=0 ; i <[resultArray count];i++)
            {
                if(i%4 == 3)
                {
                    [resultObjectsArray addObject:tmpArray];
                    [tmpArray removeAllObjects];
                    NSLog(@"Here we add a new object");
                }
                else
                {
                    [tmpArray addObject:[resultArray objectAtIndex:i]];
                    NSLog(@"%@",[resultArray objectAtIndex:i]);
                }
            } 
            fclose(in);     
            NSLog(@"First object in the result Array: %@",[[resultObjectsArray objectAtIndex:0] objectAtIndex:0]);      
        }

[pool drain];

所有我能看到的是

NSLog(@"First object in the result Array: %@",[[resultObjectsArray objectAtIndex:0] objectAtIndex:0]);

我遇到下一个错误: 未捕获异常NSRangeException,原因:索引0超出范围0(在'objectAtIndex:'中)

1 个答案:

答案 0 :(得分:1)

我假设你不小心在输入文件的末尾留下了一个(空白)行,因为你提到的异常并没有按字面意思给出。我已编辑了您的问题以反映这一点。然后,假设文件以这种方式修复:

异常的直接原因是,在调用最终tmpArray时,NSLog为空。原因是每次通过前一个循环重用相同的tmpArray对象;您将tmpArray添加到resultObjectsArray,然后清除tmpArray并开始向其中添加其他成员。这是一个问题的原因是数组元素是由引用添加的,而不是复制的;您需要每次都复制tmpArray或制作一个全新的临时对象。

因此,当您到达最终NSLog时,resultObjectsArray中的第一个元素与tmpArray是同一个对象;你刚刚在[tmpArray removeAllObjects]条件中调用了if(i%4 == 3),所以它是空的;因此第二个objectAtIndex:0引发了异常。

现在,至于为什么输入文件的原始版本(最后没有空行的那个)不会触发相同的异常(但也无法正常运行):你的for循环变为逐行,并将每行添加到tmpArray,直到它到达索引可被4整除的行,此时它会清除tmpArray,以便下次可以开始添加更多行。您提供的输入文件的原始版本有11行,因此最后未清除tmpArray;因此,tmpArray以及用作resultObjectsArray元素的相同对象包含最后三行读取。由于它不是空的,objectAtIndex:0没有提出一个除外。但与此同时,逻辑是错误的,因为NSLog应该返回数组中的 first 元素,但是当它发生时,所有元素都是对同一个元素的引用{ {1}}对象,仅包含最后一行的行。