18

我需要检查某个数组是否包含某个对象,如果包含,则删除该对象。如果它没有那个对象,函数应该把它添加到数组中。问题是对象总是被添加,因为检查语句总是返回 false。

这是我当前的功能:

- (void) myFunction:(NSString *)parameter {

    if (![myMutableArray containsObject:parameter]) {

        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);

    } else {

        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);

    }
}
4

5 回答 5

32

containsObject 正在对数组中的每个对象调用 isEqual。您正在检查什么类型的对象?如果是自定义对象,覆盖并实现方法 isEqual。

我猜您正在尝试检查对象的值,但 containsObject 实际上是调用 isEqual 来比较对象的引用,而不是其实际值。

于 2013-01-16T19:23:26.873 回答
19
if (![arrList containsObject:arrObj]) {
    // do something
}

包含对象:

于 2014-03-04T05:45:56.933 回答
7

首先,您需要检查您在 this 中添加的类型数据或对象myMutableArray。根据您的方法,您正在检查已传递参数的字符串类型的可变数组parameter。您可能包含 int 或 float 数组。

您的数组中可能存在类型转换问题。如果您是 STRING 类型的数据,那么您可以使用其他类似的方法。

- (void) myFunction:(NSString *)parameter {

for (int i = 0 ; i < [myMutableArray count ] ; i++) {


    if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) {
        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);
    }
    else{
        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);
    }
}

}

希望这会帮助你。如果您的对象不是 NSString 类型,那么您需要转换。

于 2013-01-16T19:58:53.297 回答
2

您应该isEqual:在您的自定义类中实现。默认情况下,只有当它们共享相同的引用时,两个对象才是相同的。

还要确保在使用可变数组之前对其进行初始化。

编辑

看来您的数组的变量名很可能输入错误。

  • myMutableArray
  • myMutbaleArray
于 2013-01-16T19:21:04.790 回答
1

你可能忘记初始化你的NSMutableArray. 如果未初始化,您addObject将向对象发送消息,该nil对象无效,并且该数组永远不会包含您之前添加的内容...

当然,如果数组是nil,那么contains检查将始终返回 false。根据 Objective-C 文档:

如果该方法返回一个对象、任何指针类型、任何大小小于或等于 sizeof(void*) 的整数标量、float、double、long double 或 long long,则发送到 nil 的消息返回 0 .

0 为假

于 2013-01-16T19:23:26.590 回答