循环有缺陷!

时间:2011-04-01 23:53:00

标签: iphone objective-c xcode core-data loops

我有一个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]);
}

4 个答案:

答案 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处保留新项目。

通过向后循环,您可以删除此混洗,并删除所有索引。