目前我使用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
调试这些代码行以获得正确的结果
我在这里做错了什么?
答案 0 :(得分:0)
您还需要在Design对象中提供isEqual和hash。这取自NSObject的协议描述:
isEqual:方法 返回一个布尔值,指示接收器和给定对象是否相等。 (所需的)
讨论 此方法定义了实例相等的含义。例如,如果容器对象的相应对象都对isEqual:request响应YES,则容器对象可以将两个容器定义为相等。有关使用此方法的示例,请参阅NSData,NSDictionary,NSArray和NSString类规范。
如果两个对象相等,则它们必须具有相同的哈希值。如果在子类中定义isEqual:并打算将该子类的实例放入集合中,则最后一点尤为重要。确保您还在子类中定义哈希。