NSSet中的重复自定义对象

时间:2013-10-25 02:15:16

标签: objective-c cocoa hash nsset

我对Objective-C中的NSMutableSet有一些问题。 我了解到NSSet将比较两个对象的哈希码以确定它们是否相同。 问题是,我自己实现了一个类NSObject的类。该类中有一个属性NSString *name。我想要做的是当这个自定义类的实例具有相同的变量值“name”时,它们应该是相同的,并且在添加到NSMutableSet时不应该复制这样的相同类。

所以我覆盖- (NSUInteger)hash函数,调试显示它为我的两个实例obj1, obj2 (obj1.name == obj2.name)返回相同的哈希值。但是当我将obj1,obj2添加到NSMutableSet时,NSMutableSet仍包含obj1,obj2。

我尝试了两个具有相同值的NSString,然后将其添加到NSMutableSet,该集合只有一个NSString

可能是什么解决方案?谢谢你的帮助!

自定义类: Object.h:

#import <Foundation/Foundation.h>

@interface Object : NSObject

@property (retain) NSString *name;

@end

Object.m

@implementation Object
@synthesize name;

-(BOOL)isEqualTo:(id)obj {
    return [self.name isEqualToString:[(Object *)obj name]] ? true : false;
}

- (NSUInteger)hash {
    return [[self name] hash];

}
@end

和主要:

#import <Foundation/Foundation.h>
#import "Object.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Object *obj1 = [[Object alloc]init];
        Object *obj2 = [[Object alloc]init];
        obj1.name = @"test";
        obj2.name = @"test";
        NSMutableSet *set = [[NSMutableSet alloc] initWithObjects:obj1, obj2, nil];
        NSLog(@"%d", [obj1 isEqualTo:obj2]);
        NSLog(@"%ld", [set count]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:8)

您必须实施isEqualTo:

,而不是实施isEqual:
- (BOOL)isEqual:(id)object {
    return [object isKindOfClass:[MyObject class]] &&
           [self.name isEqual:[(MyObject *)object name]];
}

如果NOself.name都是object.name,这将(可能会错误地)返回nil。如果您想要返回YES,如果两个属性都是nil,则应使用

- (BOOL)isEqual:(id)object {
    if ([object isKindOfClass:[MyObject class]]) {
        return (!self.name && ![(MyObject *)object name]) ||
        [self.name isEqual:[(MyObject *)object name]];
    }
    return NO;
}