【问题标题】:Flawed for loop!for循环有缺陷!
【发布时间】:2011-04-01 23:53:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    通过调用[histArray removeObject:h],您可以在遍历数组时缩短数组。既然要删除 histArray 中的每个对象,为什么不等到循环完成后再使用 [histArray removeAllObjects] 一次性删除所有对象?

    另一种解决方案是从头到尾循环遍历数组。

    【讨论】:

      【解决方案2】:

      在迭代其内容时不要修改数组。如果您使用的是快速迭代,这一点尤其重要,但即使您不使用它也可能是一个问题,就像这里一样。问题是您正在通过移除对象来更改对象的位置。

      如果你必须这样做,你可以:

      • 从数组末尾开始移除对象并朝着开头移动,或者
      • 不要增加索引。如果将数组开头的对象删除 [array count] 次,则将删除所有对象。

      但同样,如果您使用快速迭代或使用枚举器,请不要更改数组。

      【讨论】:

        【解决方案3】:

        您正在从“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]);
        }
        

        【讨论】:

          【解决方案4】:

          尝试改变:

          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 处。

          通过向后循环,您删除了这种洗牌,所有索引都应该被删除。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-10
            • 2012-05-22
            • 2015-09-08
            • 2020-04-10
            • 1970-01-01
            • 2019-06-25
            • 1970-01-01
            • 2019-07-09
            相关资源
            最近更新 更多