ios - 从 NSMutableArrays 移除对象

标签 ios xcode arrays

我有这个方法,当我按下一个按钮并从 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];
}

最佳答案

[编辑4]

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,其余时间都设置!!!您也永远不会初始化它,因此您永远不会“真正”知道编译器在下次调用您的操作时将如何处理该变量。如果它“分配”相同的内存地址给您的删除变量,即使您没有将其定义为静态变量,“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 方法注释。

直接来自 Apple:

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

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

关于ios - 从 NSMutableArrays 移除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158539/

相关文章:

ios - 如何将 NSOperationQueue 内部的 NSData 分配给 NSOperationQueue 外部的 NSData

ios - Xcode UI测试的一个测试用例中的Delay/Wait

ios - swift 2 Core Data Predicate 数组中不区分大小写的搜索集

ios - 我需要一个字一个字地强调

ios - Xcode 8.2.1 无法添加文件夹引用

swift - 没有这样的模块 '####'

c++ - C++中使用数组访问多个不同长度数组的正确方法

javascript - Java用Rhino调用JS(未定义Uint8Array)

c++ - 类中指针访问私有(private)数组的声明及内存分配

ios - 为 swift 2.3 应用程序迁移到 xcode 9