0

我正在尝试将字符串插入到 NSMutableArray 中的特定位置,所以我已经完成 [myMutableArray insertObject:newString atIndex:219]; 了顺便说一句,当我这样做时,[myMutableArray count]它返回 273,所以我知道有足够的元素。然而,问题是每次我尝试这个时它都会给出一个 NSRangeException。奇怪的是,当我记录[myMutableArray class]它时它返回_ _NSArrayM,但是当出现异常时,它说我正在调用[__NSCFString insertString:atIndex:],这就是错误的来源。我肯定在使用 insertObject,它绝对是一个可变数组。有谁知道我的问题可能是什么?此外,当我使用断点时,它会突出显示我发布的第一段代码,所以这就是异常所在。

allIDs = [self allIDs];
[allIDs insertObject:[newStudent idNumber] atIndex:x];

- (NSMutableArray*) allIDs
{
    if (!allIDs) {
        allIDs = [[NSMutableArray alloc] init];
    }

    filePath = [[NSString alloc] init];
    NSError *error;
    filePath = [[self getDocumentDirectory] stringByAppendingPathComponent:@"List of Student IDs"];
    NSString *txtInFile = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUnicodeStringEncoding error:&error];

    if(!txtInFile) {
        return nil;
    }

    NSMutableString *tempName = [NSMutableString string];

    for (int i = 0; i < [txtInFile length]; i++) {

        if ([txtInFile characterAtIndex:i] == '*') {

            [allIDs addObject:tempName];

            tempName = [NSMutableString string];
        } else {
            [tempName appendFormat:@"%c", [txtInFile characterAtIndex:i]];
        }
    }

    return allIDs;
}

因此,我返回并循环将其插入到 219 的所有索引中,然后打印出索引以查看它开始在哪个索引处引发异常。

for (int i = 0; i < 219; i++) {
    NSLog(@"%i", i);
    [allIDs insertObject:newStudent.idNumber atIndex:i];
}

出于某种原因,它打印了最多 218 个没有问题的所有内容,然后它跳到 801505682082758655 并记录了很多次,然后才出现超出范围的异常

4

2 回答 2

2

如果错误表明它insertString:atIndex:是导致异常的调用,那么就是该调用并且与insertObject:atIndex:. 更具体地说,它在调用 NSCFString 时给出了insertString:atIndex:范围异常。因此,与您的阵列无关。

当你发生崩溃时,会有一个回溯。发表它。这包括例外。同样,您可以很容易地在调试器中创建异常断点。设置一个,然后查看代码中断的位置。

除非您使用 ARC,否则该代码非常容易泄漏。即使使用 ARC,也存在一些问题。也就是说,这是没有意义的:

filePath = [[NSString alloc] init];
filePath = [[self getDocumentDirectory] stringByAppendingPathComponent:@"List of Student IDs"];

没有必要filePath = [[NSString alloc] init];

于 2013-06-23T17:30:04.117 回答
-2

我认为你的问题是你没有遵循 iOS 的基本内存管理规则:如果方法返回一个在方法中实例化的对象,则接收新对象的对象成为这个新对象的唯一所有者,如果调用的方法以allocnewcopy或开头mutableCopy。如果不是,就像您的情况一样,新对象将被放入当前的自动释放池中,并且 - 如果没有人成为新所有者 - 在应用程序返回运行循环时释放。
我假设在您的情况下,新对象被释放,并且内存被另一个对象覆盖,显然是一个NSString对象。当您现在尝试调用(已发布)对象insertObject:atIndex:时,您可能会调用取代它insertString:atIndex:NSString对象。
我的建议是allIDs正确命名您的方法,例如newAllIDs,然后再试一次。

于 2013-06-23T17:26:04.813 回答