如何正确地从NSMutableArray中删除对象?

时间:2013-12-18 11:31:22

标签: objective-c arrays nsmutablearray

我尝试在循环中从NSMutableArray中删除项目。我有一个数组:(2,3,4,5,6)。

       int j = [array count];        
       while (array != NULL) {

         NSUInteger g = 0;
    for (int q = 0; q < j; q++) {

        [array removeObjectAtIndex:g];
        }

当我设置断点时(在第一次迭代后),我得到以下内容:

[0]=(id)0x00000000
[1]=(id)0x071421a0(int)3
[2]=(id)0x071421b0(int)4
[3]=(id)0x071421e0(int)5

我不明白如何在每次迭代中删除第一个对象。我的意思是跟随它将是第一个。为什么最后一个也每次都消失了? 感谢。

4 个答案:

答案 0 :(得分:2)

从数组中删除对象集合的另一种方法是将要删除的对象添加到单独的数组中,然后使用它来一次性从主数组中删除对象。这样做有好处,其中最不重要的是没有越界风险,也可以回滚,因为你基本上只需要在一个批处理过程中删除:

int j = [array count];  
NSMutableArray *theseObjects = [NSMutableArray array];
for (int q = 0; q < j; q++)
{
    id thisObject = [array objectAtIndex:q];
    BOOL shouldRemoveThisObject = ...//<--determine if you want to remove this object
    if (shouldRemoveThisObject)
        [theseObjects addObject:thisObject];
}
[array removeObjectsInArray:theseObjects];

答案 1 :(得分:1)

你无法按照自己的意愿去做。

j设置为5(数组计数)但数组的大小在每次迭代时都会减少。因此,在某个时间点,它会尝试访问 数组越界 ,因此异常会导致您的应用崩溃。

相反,您需要执行以下操作:

while (array.count > 0) {
    NSLog(@"Arr before removal is  : %@",array);
    [array removeObjectAtIndex:0];
    NSLog(@"Arr after removal is  : %@",array);

}

如果出于某种其他原因,您只想先删除,那么以上操作就可以了。

如果您想一次删除所有对象:您可以使用:

[array removeAllObjects];

答案 2 :(得分:1)

看起来您要删除所有条目。然后你也可以打电话给[myArray removeAllObjects];

答案 3 :(得分:1)

您无法从循环内的NSMutableArray中删除对象。这是因为,在这种情况下,数组大小会在每次迭代时发生变化(最坏情况),您可以尝试访问越界索引。

最好的选择是Jeremy的解决方案。将所需对象保留在分离的数组上,然后从循环外的主数组中删除这些对象。