我有这个方法,当我按下按钮并从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];
}
}
答案 0 :(得分:4)
从可变数组中删除对象时,它不会“留下一个洞”。可变数组中的每个其他对象只向下移动一个凹口,并且数组的计数(或长度)会因您删除的对象数量而缩小。
如果您在用户界面中看到“漏洞”,则可能是您的表视图刷新方法有问题,或者您正在显示阵列的内容。但是基本的可变数组类肯定知道如何处理删除,添加和管理自己的对象。
答案 1 :(得分:4)
<强> [EDIT4] 强>
用户523234的优点
[favs removeObjectIdenticalTo: parent];
在Apples网站上查看removeObjectIdenticalTo以获取NSMutableArray
<强> [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++;
}
}
如果您没有删除当前项目,则只会升级计数器。
查看removeObjectAtIndex方法说明。
直接来自Apple:
“为了填补空白,索引之外的所有元素都会通过从索引中减去1来移动。”
这应该在Apple的API中自动完成。你不应该做任何事情,真的不应该留下任何“漏洞”。
答案 2 :(得分:2)
从NSMutableArray中删除对象不会留下漏洞。 Apple的数组实现并不稀疏,这意味着当您删除对象时,数组会被调整大小,以便没有空格。
答案 3 :(得分:1)
除了@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];