我有一个名为“网站”的自定义类:
#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用来确保唯一性。
非常感谢任何见解。
答案 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实现:
我对NSObject isEqual实现不太熟悉。
@ phix23。是的,这很有效。 @Dirk,谢谢你的解释。非常感谢大家,你只是在调试器中节省了很多时间。