2012-06-22 123 views
2

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

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

}

+0

你碰到什么类型的问题?顺便说一句:如果(擦除)...可能无法一直工作。因为擦除可以有一个随机数... – user523234

回答

4

[EDIT4]

大点的user523234

[favs removeObjectIdenticalTo: parent]; 

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

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

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

看那removeObjectAtIndex方法的注释。

直接从苹果:

“填补了国内空白,超越指数的所有元素都从他们的指数减去1感动。”

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

+0

哦,我没有注意到,但数组不应该有重复的对象,所以不是问题。它仍然无法正常工作。有时它会跳过删除部分并添加一个对象,从而创建重复项,并且如果再次调用,仅删除其中的一个,即使使用更新后的代码... – user1447339

+0

什么是父母呢?数组中的对象是什么?也可以跳过删除部分并添加父类型对象的原因是,您永远不会重置您的擦除变量。 – trumpetlicks

+0

int erase = 0;在开始时应该重置它。父母是一个NSNumber。 – user1447339

4

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

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

+0

我其实认为如果你读他的代码,他的问题是错误地陈述。我认为他的漏洞是他正在删除的WAY的人工产物,因为他每次删除对象时都可能跳过列表中的项目! – trumpetlicks

+0

gah ...你是对的。 +1给你。我很失望,这个问题并没有让我能够帮助他更快地做出正确答案。 –

+0

大声笑,对:-)由于语言障碍,我曾经发生过这么多次,它只是让我笑! – trumpetlicks

2

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

+0

我其实认为如果你读他的代码,他的问题是错误地陈述。我认为他的漏洞是他正在删除的WAY的人工产物,因为他每次删除对象时都可能跳过列表中的项目! – trumpetlicks

+0

很好的通话,甚至没有抓住它。 – Dima

1

除了@trumpetlicks的答案,你也可以试试这个:
编辑:较短的版本。

+0

其实更好的是:[favs removeObjectIdenticalTo:parent];如果你看一下定义,它将删除与所有父母相同的“ALL”实例! +1 – trumpetlicks