繁体   English   中英

从NSMutableArrays中删除对象

[英]removing Objects from NSMutableArrays

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

- (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];
}

}

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

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

[EDIT4]

用户523234的重点

[favs removeObjectIdenticalTo: parent];

查看Apples站点上的removeObjectIdenticalTo以获取NSMutableArray

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

[EDIT3]

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

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

[EDIT2]

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

[编辑]

Didnt最初了解你的问题。 我想我现在明白了,更好地看看你的代码。

你的代码:

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++;
    }
}

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

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

查看removeObjectAtIndex方法说明。

直接来自Apple:

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

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

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

除了@trumpetlicks的答案,您还可以尝试这样:
编辑:较短的版本。

if ([favs containsObject:parent])  //check for present of parent in the favs
{
    [favs removeObjectIdenticalTo:parent];  //remove all occurrences of parent
} else
    [favs addObject:parent];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM