Objective-c:当key存在时,自定义类实例作为字典键返回nil

时间:2014-01-13 16:37:14

标签: objective-c nsdictionary nscopying

我有一个自定义类,我在字典中使用as键的实例。问题是,有时候 (并非所有时间)使用我的一个自定义从字典中请求值 当字典中的键 时,实例键会返回nil。我看了 关于如何使用自定义对象作为字典键的网络,以及我所有的 能够找到的是你需要实现NSCopying协议 我做完了。

我的班级看起来像这样:

// .h
@interface MyObject: NSObject <NSCopying>

@property (copy) NSString* someString;
@property (copy) NSString* otherString;
@property int someInt;

+ (instancetype) objectWithString:(NSString*)str;
- (id) copyWithZone:(NSZone*)zone;
@end

// .m
@implementation MyObject

@synthesize someString;
@synthesize otherString;
@synthesize someInt;

+ (instancetype) objectWithString:(NSString*)str {
   id obj = [[self alloc] init];
   [obj setSomeString:str];
   [obj setOtherString:[str lowercaseString];
   [obj setSomeInt:0];
   return obj;
}

- (id) copyWithZone:(NSZone*)zone {
   id other = [[[self class] allocWithZone:zone] init];
   [other setSomeString:self.someString];
   [other setOtherString:self.otherString];
   [other setSomeInt:self.someInt];
   return other;
}
@end

然后我把这些东西放在一个像这样的可变字典中:

MyObject* key1 = [MyObject objectWithString:@"Foo"];
MyObject* key2 = [MyObject objectWithString:@"Bar"];
NSNumber* value1 = [NSNumber numberWithInt:123];
NSNumber* value2 = [NSNumber numberWithInt:456];

NSMutableDictionary* theDict = [[NSMutableDictionary alloc] init];
[theDict setObject:value1 forKey:key1];
[theDict setObject:value2 forKey:key2];

现在我想做的只是从字典中弹出一个键/值对,所以我这样做 像这样:

MyObject* theKey = [[theDict allKeys] firstObject];
NSNumber* theValue = [theDict objectForKey:theKey];

这就是我遇到问题的地方。 大多数当时,这很好用。 但是,有时objectForKey:theKey会返回nil。我提出了一个断点 在我的代码中,可以确认theKey确实存在theDict

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

您还应该在自定义对象上实施-isEqual:-hash

欲了解更多信息: Apple DocumentationNSHipster article

你必须这样做的原因是当你把它们放在字典中时可以复制密钥,而isEqual的默认实现只是指针比较。