我如何使用insertObject AtIndex?

时间:2013-06-23 16:05:23

标签: ios objective-c

我正在尝试将字符串插入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];
}

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:-2)

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