我有一个for循环,由于某些原因,我不能删除数组中的所有对象,只有少数。
我做错了什么?
- (void)deleteAllObjects {
AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"Before: %d", [histArray count]);
for (int i = 0; i < [histArray count]; i++) {
History *h = (History *)[histArray objectAtIndex:i];
[[appDel managedObjectContext] deleteObject:h];
[histArray removeObject:h];
[appDel saveContext];
NSLog(@"During: %d", [histArray count]);
[self fetchUpdates];
}
NSLog(@"After: %d", [histArray count]);
}
答案 0 :(得分:4)
通过调用[histArray removeObject:h]
,您在循环时缩短数组。由于你要删除histArray中的每个对象,为什么不等到循环完成后再用[histArray removeAllObjects]
一次删除所有对象?
另一种解决方案是从最后到开头循环遍历数组。
答案 1 :(得分:2)
在迭代其内容时,请勿修改数组。如果你使用快速迭代,这一点尤其重要,但即使你不是这样,它也可能是一个问题。问题是你通过删除对象来改变对象的位置。
如果你必须这样做,你可以:
但是,如果您使用快速迭代或者使用枚举器,请不要更改数组。
答案 2 :(得分:1)
您正在从“histArray”中删除,并且您正在同一个阵列上运行循环。我认为需要在每次迭代后重置索引。 删除语句“[histArray removeObject:h];”从你的循环和循环结束调用你的数组上的removeAll函数来清除它。它将解决问题,
以下是修改后的代码
- (void)deleteAllObjects {
AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"Before: %d", [histArray count]);
for (int i = 0; i < [histArray count]; i++) {
History *h = (History *)[histArray objectAtIndex:i];
[[appDel managedObjectContext] deleteObject:h];
[appDel saveContext];
NSLog(@"During: %d", [histArray count]);
[self fetchUpdates];
}
[histArray removeAllObjects];
NSLog(@"After: %d", [histArray count]);
}
答案 3 :(得分:0)
尝试更改:
for (int i = 0; i < [histArray count]; i++) {
成:
for (int i = [histArray count] - 1; i >= 0; i--) {
当前循环不起作用的原因是,当您删除索引0时,索引1到50不会保持它们所在的位置,它们会随机播放以使1变为0,2变为1,依此类推。
因此,当您删除索引1时,下一次循环时,您将在索引0处保留新项目。
通过向后循环,您可以删除此混洗,并删除所有索引。