我正在尝试将字符串插入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并记录了很多次,然后才出现超出范围的异常
答案 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:如果方法返回在方法中实例化的对象,则接收新对象的对象将仅成为此新对象的所有者,如果调用方法的名称以alloc
,new
,copy
或mutableCopy
开头。如果没有,就像你的情况一样,新对象被放入当前的自动释放池,并且 - 如果没有人成为新的所有者 - 当应用程序返回到运行循环时释放。
我假设在你的情况下,新对象被释放,内存被另一个对象覆盖,显然是一个NSString
对象。当您现在尝试调用(已发布的)对象insertObject:atIndex:
时,您可能会在取代它的insertString:atIndex:
对象中调用NSString
。
我的建议是正确命名您的方法allIDs
,例如newAllIDs
,然后再试一次。