【问题标题】:NSMutableDictionary does not work properlyNSMutableDictionary 无法正常工作
【发布时间】:2023-03-06 03:06:01
【问题描述】:

目前我在使用 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 并且测试正常

  • Hierarchy 也实现了 NSCopying

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

我在这里做错了什么?

【问题讨论】:

  • [_designs setObject:array forKey:aDesign]; 中的键应该是字符串而不是对象。
  • 嗨 samfisher,根据 Apple 的说法,key 可以是符合 NSCopying 协议的对象。所以我相信这不是问题。

标签: ios nsmutabledictionary


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你就是那个人,大卫 :)。添加哈希方法解决了它。但是我决定从一开始就不实现 hash 方法,因为我认为默认情况下它应该返回相同的值,因此实现 isEqual 就足够了。
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
  • 2018-10-02
  • 2016-09-04
相关资源
最近更新 更多