0

目前我在使用 NSMutableDictionary 时遇到了一个非常奇怪的问题:相同的代码,相同的数据,但键值对对象的不同结果。

我的字典使用用户定义的类对象作为键,值是对象数组。

这是构建字典的代码:

_designs = [[NSMutableDictionary alloc] init];
for (Hierarchy * hier in downloadedHierarchies.objects)
{
    NSLog(@"Hierarchy [%d - %d - %@]", hier.designId, hier.hierarchyId, hier.hierarchyName);
    Design * aDesign = [[Design alloc] initWithId:hier.designId withName:hier.designName];

    NSMutableArray *array = ([_designs objectForKey:aDesign] == nil) ? [[NSMutableArray alloc] init] : (NSMutableArray *)[_designs objectForKey:aDesign];
    NSLog(@"Design %d has %d of hierarchies", aDesign.designId, array.count);

    [array addObject:hier];

    [_designs setObject:array forKey:aDesign];
    NSLog(@"Design %d now has %d of hierarchies", aDesign.designId, [[_designs objectForKey:aDesign] count]);
}

问题是: - 我的测试数据只有 1 个设计和 3 个层次结构。每次运行应用程序时,我的字典中都会得到不同的结果。有时我得到 2 个键值对,有时是 3 个。甚至键都来自相同的设计(相同的 designId),并且层次结构分散在这些键值对中。

一些注意事项:

  • 设计已经实现了 NSCopying 和 isEqual 并且测试正常

  • Hierarchy 也实现了 NSCopying

  • 调试这些代码行给出正确的结果

我在这里做错了什么?

4

1 回答 1

0

您还需要在 Design 对象中提供 isEqual 和 hash。这取自 NSObject 的协议描述:

isEqual:返回一个布尔值,指示接收者和给定对象是否相等。(必需的)

  • (BOOL)isEqual:(id)anObject 参数 anObject 要与接收者进行比较的对象。返回值 如果接收者和对象相等,则返回 YES,否则返回 NO。

讨论 该方法定义了实例相等的含义。例如,一个容器对象可能将两个容器定义为相等,如果它们对应的对象都对 isEqual: 请求响应为 YES。有关使用此方法的示例,请参阅 NSData、NSDictionary、NSArray 和 NSString 类规范。

如果两个对象相等,则它们必须具有相同的哈希值。如果您在子类中定义 isEqual: 并打算将该子类的实例放入集合中,那么最后一点尤其重要。确保您还在子类中定义哈希。

于 2012-07-19T13:06:38.943 回答