NSMutableSet不保持元素唯一

时间:2011-02-07 15:24:22

标签: objective-c hash set equality

我有一个名为“网站”的自定义类:

#import "Site.h"
#import <MapKit/MapKit.h>

@implementation Site

@synthesize name, desc, coordinate;

+ (Site*) siteWithName:(NSString *)newName 
        andDescription:(NSString *)newDesc 
           andLatitude:(double)newLat 
          andLongitude:(double)newLon
{
    Site* tmpSite = [[Site alloc] initWithName:newName 
                                andDescription:newDesc 
                                   andLatitude:newLat 
                                  andLongitude:newLon];
    [tmpSite autorelease];
    return tmpSite;
}

- (Site*) initWithName:(NSString *)newName 
        andDescription:(NSString *)newDesc 
           andLatitude:(double)newLat 
          andLongitude:(double)newLon
{
    self = [super init];
    if(self){
        self.name = newName;
        self.desc = newDesc;
        coordinate.latitude = newLat;
        coordinate.longitude = newLon;
        return self;
    }
    return nil;
}

- (NSString*) title 
{
    return self.name;
}

- (NSString*) subtitle 
{
    return self.desc;
}

- (BOOL)isEqual:(id)other {
    if (other == self)
        return YES;
    if (![super isEqual:other])
        return NO;
    return [[self name] isEqualToString:[other name]]; // class-specific
}

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

- (void) dealloc 
{
    [name release];
    [desc release];
    [super dealloc];
}

@end

我有一个名为allSites的NSMutableSet,我正在通过unionSet方法添加其他网站集。这有效,并且所有网站集都添加到allSites集。但是不会删除重复的网站。我怀疑这与我在Site的isEqual或hashcode实现中的错误有关,我理解NSMutableSet用来确保唯一性。

非常感谢任何见解。

3 个答案:

答案 0 :(得分:1)

更改isEqual方法:

- (BOOL)isEqual:(id)other {
    if (other == self)
        return YES;
    if ([[self name] isEqualToString:[other name]])
        return YES;
    return [super isEqual:other];
}

答案 1 :(得分:0)

Site课程的超类是什么?对超类“isEqual:方法的调用看起来有点可疑,特别是如果你的类是NSObject的直接后代。在这种情况下,[super isEquals: other]基本上归结为self == other,这显然不是您想要的。例如,在coding guidelines for cocoa

中讨论了这一点
  

默认情况下isEqual:查找每个对象地址的指针相等性,hash会根据每个对象的地址返回一个哈希值,因此这个不变量保持不变。

这只是猜测,但是......

答案 2 :(得分:0)

超类是NSObject。我正在遵循苹果推荐的isEqual实现:

http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/ObjectComparison.html

我对NSObject isEqual实现不太熟悉。

@ phix23。是的,这很有效。 @Dirk,谢谢你的解释。非常感谢大家,你只是在调试器中节省了很多时间。