【问题标题】:Obj C - NSMutableArray containsObject return trueObj C - NSMutableArray containsObject 返回真
【发布时间】:2020-03-12 19:39:49
【问题描述】:

NSMutableArraycontainsObject即使地址和数据不同也会返回true。

我已经看过这个帖子NSMutableArray containsObject returns true, but it shouldnt ,但我仍然没有找到我的解决方案:

下面是我的场景:

    NSMutableArray *destClasses = [NSMutableArray array];
    id sourceClasses = [dict objectForKey:@"Classes"];
    if ([sourceClasses isKindOfClass:[NSArray class]]) {
                for (NSDictionary *class in sourceClasses) {
                    MyClass *a = [[MyClass alloc] init];
                    [a arrangeClassWithDictionary:classDict]; //this methods assigns value to a from classDict
                    if (![destClasses containsObject:a]) {
                        [destClasses addObject:a];
                    }
                }
            }

在第一次迭代中destClasses 添加了一个MyClass 对象,在第二次迭代中[destClasses containsObject:a] 返回true,即使a 分配了不同的地址和不同的值。

我在这里做错了什么。请帮忙。

【问题讨论】:

  • 来自containsObject:“如果 isEqual:返回 YES,则认为对象相等。”您是否覆盖了isEqual:?您是否有重现该问题的工作示例?如果它存在,如何使用indexOfObject:,检索对象,并将它们与isEqual: 进行比较?
  • 我没有压倒一切!!我在字典中有 2 个值,但是当我在数组中附加对象时,它只会添加最后一个,字典中的所有值都相似,只需要一个属性。
  • @PrabaSaran - 编辑您的问题并包含足够的代码来演示......请参阅minimal reproducible example

标签: ios objective-c nsmutablearray


【解决方案1】:

我得到了答案。

containsObject: 将isEqual: 消息发送到它的每个对象 包含以您的对象作为参数。它不使用==,除非 isEqual: 的实现依赖于==

我必须重写 isEqual: 方法来为我的对象字段提供相等性检查,如下所示,

- (BOOL)isEqual:(id)object
{
    BOOL result = NO;

    if ([class isKindOfClass:[self class]]) {
        MyClass *otherObject = object;
        result = [self.name isEqualToString:[otherObject name]];
    }

    return result;
}

【讨论】:

  • 注意:如果你覆盖isEqual,你也应该覆盖hash(参见两者的文档)。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多