Objective-C奇怪错误信号

Objective-C奇怪错误信号,objective-c,sigabrt,Objective C,Sigabrt,我正在学习Objecive-C,并尝试在循环中删除object方法。 它不能正常工作。我接收线程1:程序接收信号:SIGABRT。在那条线上。 怎么了 NSMutableArray *bookListMutable = [NSMutableArray arrayWithObjects:@"TitleM 2", @"TitleM 4", @"TitleM 5", nil]; [bookListMutable addObject:@"TitleM 3 added"]; [bookListMutabl

我正在学习Objecive-C,并尝试在循环中删除object方法。 它不能正常工作。我接收线程1:程序接收信号:SIGABRT。在那条线上。 怎么了

NSMutableArray *bookListMutable = [NSMutableArray arrayWithObjects:@"TitleM 2", @"TitleM 4", @"TitleM 5", nil];
[bookListMutable addObject:@"TitleM 3 added"];
[bookListMutable insertObject:@"TitleM 1 inserted" atIndex:0];

long countMutable;
countMutable = bookListMutable.count;


for(int y = 0; y < countMutable; y++){
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]];
}

p.S.xCode 4.1

问题在于您以错误的顺序删除项目。删除索引0处的项后,所有索引都将递减1。所以你可以这样做:

for(int y = countMutable-1; y >= 0; y--) {
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]];
}
或者这个:

for(int y = 0; y < countMutable; y++) {
    [bookListMutable removeObject:[bookListMutable objectAtIndex:0]];
}

我将此作为对代码的一个小修改,但要注意,有更好的方法可以完成类似的操作,例如使用removeObjectAtIndex:。请参阅文档:

我发现代码中有很多地方可能有问题,但最糟糕的是:从索引0开始删除数组中的对象,直到计数。这意味着i=0,1,2,3,而数组继续将元素移回位置0。这肯定会引发异常,这样只能擦除一半数组


替代方法:使用清除数组[bookListMutable removeAllObjects]的方法,或从计数向下迭代到0。

不应按该顺序删除项。假设数组有4个项{0,1,2,3},并模拟程序的执行:

y=0的第一次迭代:从{0,1,2,3}中删除索引0处的项会得到{1,2,3}

y=1的第二次迭代:从{1,2,3}中删除索引1处的项会得到{1,3}

y=2的第三次迭代:从{1,3}中删除索引2处的项。哎呀,索引2=>Exception处没有任何项

所以你应该像这样向后迭代:

for(int y = countMutable-1; y >= 0; y--) {
    [bookListMutable removeAtIndex:y]];
}
或者使用内置方法:

[bookListMutable removeAllObjects];

1次更新,有一个Xcode 4.3。2 SIGABRT通常是一个例外。你检查控制台了吗?那是哪条线?还有,为什么不使用removeObjectAtIndex:,或者removeAllObjects?!我试着做这本书上的练习