从 NSMutableArray 中删除 for 循环中的对象

Posted

技术标签:

【中文标题】从 NSMutableArray 中删除 for 循环中的对象【英文标题】:Deleting objects within a for loop from a NSMutableArray 【发布时间】:2013-01-23 02:38:05 【问题描述】:

我正在使用UITableView,并且对于作为UITableView 数据源的数组中的每个对象,如果它们满足某个if 语句,我将删除它们。我的问题是它只会从数组中删除所有其他对象。

代码:

UIImage *isCkDone = [UIImage imageNamed:@"UITableViewCellCheckmarkDone"];
int c = (tasks.count);
for (int i=0;i<c;++i) 
    NSIndexPath *tmpPath = [NSIndexPath indexPathForItem:i inSection:0];
    UITableViewCell * cell = [taskManager cellForRowAtIndexPath:tmpPath];
    if (cell.imageView.image == isCkDone) 
        [tasks removeObjectAtIndex:i];
        [taskManager deleteRowsAtIndexPaths:@[tmpPath]
                withRowAnimation:UITableViewRowAnimationLeft];
    

这有什么问题?

【问题讨论】:

【参考方案1】:

你必须向后运行你的循环,即

for (int i=c-1;i>=0;--i)

如果您以相反的方式运行它,则删除索引位置i 处的对象会将数组中i 后面的对象向前移动一个位置。最后,您甚至会超出数组的边界。

【讨论】:

如果在删除对象时适当地减少i,则可以向前运行循环。但是,按照您的建议,向后运行循环会更简单。【参考方案2】:

如果您想保持循环向前运行,您可以:

当你的条件满足并且你removeObjectAtIndex时减少i

    if (cell.imageView.image == isCkDone) 
        ...
        --i ;
        ...
    

或在不满足您的条件时增加i

for ( int i=0 ; i<c ; ) 
    ...
    if (cell.imageView.image == isCkDone) 
        ...
     else 
    ++i ;
    

【讨论】:

以上是关于从 NSMutableArray 中删除 for 循环中的对象的主要内容,如果未能解决你的问题,请参考以下文章

NSMutablearray 崩溃删除对象

按键从 NSMutableArray 中删除对象

从 NSMutableArray 中删除对象时崩溃

从 NSMutableArray 中删除一个值

如何从 NSMutableArray 中删除对象?

从 NSMutableArray 中删除随机项