NSMutableDictionary无法正常工作

时间:2012-07-19 12:44:17

标签: ios nsmutabledictionary

目前我使用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),层次结构分散在这些键值对中。

一些注意事项:

  • Design已经实现了NSCopying以及isEqual并且测试正常

  • 层次结构也实现了NSCopying

  • 调试这些代码行以获得正确的结果

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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

  • (BOOL)isEqual:方法(ID)anObject 参数 一个东西 要与接收器进行比较的对象。 回报价值 如果接收者和anObject相等则为YES,否则为NO。

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

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