2

我有这个方法,当我按下一个按钮并从 MutableArray 收藏夹中删除一个对象时,它会被调用。由于它在 Array 中留下了漏洞,我后来遇到了问题。有没有一种简单的方法可以去除那些“洞”,或者有更好的方法来去除物体?

- (IBAction)addfavs:(id)sender {

int erase;
for(int i=0;i<favs.count;i++){

    if ([favs objectAtIndex:i] == parent) {

        [favs removeObjectAtIndex:i];
        erase = 1;
    }
}
if (!erase) {
    [favs addObject:parent];
}

}

4

4 回答 4

4

当您从可变数组中删除一个对象时,它不会“留下一个洞”。可变数组中的每个其他对象仅向下移动一个级别,并且数组的计数(或长度)会随着您删除的对象数量而缩小。

如果您在用户界面中看到“漏洞”,则您的表格视图刷新方法可能有问题,或者您正在显示数组的内容。但是基本的可变数组类肯定知道如何处理删除、添加和管理自己的对象。

于 2012-06-22T14:48:11.230 回答
4

[编辑4]

user523234的好点

[favs removeObjectIdenticalTo: parent];

查看 Apple 网站上的 removeObjectIdenticalTo 以获取 NSMutableArray

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

[编辑3]

这是一个检查值(使用整数值)而不是对象本身的示例。

int erase = 0;
int i = 0;
while(i < favs.count){
    if ([[favs objectAtIndex:i] intValue] == [parent intValue]){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }else{
        i++;
    }
}

[编辑2]

即使它没有首先删除它也可能添加对象的原因是因为您从未重置您的“擦除”变量。第一次设置为1,其余时间设置!!!您也永远不会初始化它,因此您永远不会“真正”知道编译器将在下一次调用您的操作时对变量做什么。如果它为您的擦除变量“分配”相同的内存地址,即使您尚未将其定义为静态变量,“1”仍将常驻创建静态条件!!!

[编辑]

本来没看懂你的问题。我想我现在明白了,更好地查看您的代码。

您的代码:

int erase = 0; 
for(int i=0;i<favs.count;i++){
    if ([favs objectAtIndex:i] == parent){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }
}

当您在每次删除后增加计数器时,您所做的基本上将跳过列表中的某些项目。假设您删除了对象 3,您的计数器现在将更新为计数 4,但 4 现在是 5,而 3 现在是 4,所以在这种情况下,您实际上是在跳过第 4 项。

尝试这个:

int erase = 0;
int i = 0;
while(i < favs.count){
    if ([favs objectAtIndex:i] == parent){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }else{
        i++;
    }
}

如果您没有删除当前项目,这只会升级计数器。

[原文] https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

查看 removeObjectAtIndex 方法说明。

直接来自苹果:

“为了填补空白,所有超出索引的元素都通过从索引中减去 1 来移动。”

这应该在 Apple 的 API 中自动完成。你不应该做任何事情,而且真的不应该留下任何“漏洞”。

于 2012-06-22T14:49:47.603 回答
2

从 NSMutableArray 中移除对象不会留下漏洞。Apple 的数组实现不是稀疏的,这意味着当您删除一个对象时数组会调整大小,以便没有空格。

于 2012-06-22T14:48:30.437 回答
1

In addition to @trumpetlicks answer, you can also try this:
Edit: shorter version.

if ([favs containsObject:parent])  //check for present of parent in the favs
{
    [favs removeObjectIdenticalTo:parent];  //remove all occurrences of parent
} else
    [favs addObject:parent];
于 2012-06-22T15:25:28.657 回答