我有一个NSObject子类,我在其中实现了isEqual:
和hash
方法,如下所示:
- (BOOL)isEqual:(id)anObject {
return YES;
}
- (NSUInteger)hash {
return 1;
}
出于某种原因,我可以将这个类的多个对象添加到NSMutableSet中,即使它们是“相同的”。有什么理由不行吗?
更新:事实证明我正在将NSMutableArray实例分配给NSMutableSet类型的ivar。 D'哦!
答案 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
。