NSMutableSet允许使用相同的哈希添加多个对象

时间:2011-12-24 00:58:54

标签: objective-c

我有一个NSObject子类,我在其中实现了isEqual:hash方法,如下所示:

- (BOOL)isEqual:(id)anObject {
    return YES;
}

- (NSUInteger)hash {
    return 1;
}

出于某种原因,我可以将这个类的多个对象添加到NSMutableSet中,即使它们是“相同的”。有什么理由不行吗?


更新:事实证明我正在将NSMutableArray实例分配给NSMutableSet类型的ivar。 D'哦!

2 个答案:

答案 0 :(得分:1)

addObject方法返回void,并且不会就项目是否实际“添加”提供任何反馈。

- (void)addObject:(id)object

您是否枚举集合以确定对象是“已添加两次”?否则,是什么让你相信他们是?

如果两个集合与unionSet联合在一起,如果两个集合都包含相同的对象,则会发生错误吗?或者结果是否只包括同一个对象包括原始集合?

如果你要合并一套恰好一件商品怎么办?因为如果你同意上述内容,那么你就会理解为什么我会说以下......

我认为它只是默默地吞下第二次addObject尝试(它应该采用的方式)并继续生活。

答案 1 :(得分:1)

你的代码中必须有其他东西你做得不对,因为你在OP中显示的覆盖方法会导致NSMutableSet将我的对象识别为相同:

Test.h:

#import "Foundation/Foundation.h"
@interface Test : NSObject
@end

Test.m:

#import "Test.h"
@implementation Test
- (BOOL)isEqual:(id)anObject {
    return YES;
}
- (NSUInteger)hash {
    return 1;
}
@end

main.c中:

#include <CoreFoundation/CoreFoundation.h>
#import "Test.h"
int main (int argc, const char * argv[]) {
    Test *t1 = [[Test alloc] init];
    Test *t2 = [[Test alloc] init];
    Test *t3 = [[Test alloc] init];
    Test *t4 = [[Test alloc] init];
    NSSet *s = [NSMutableSet setWithObjects:t1, t2, t3, t4, nil];
    NSLog(@"%lu", s.count);
    return 0;
}

此代码段会按预期生成1