Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableDictionary无法正常工作_Ios_Nsmutabledictionary - Fatal编程技术网

Ios NSMutableDictionary无法正常工作

Ios NSMutableDictionary无法正常工作,ios,nsmutabledictionary,Ios,Nsmutabledictionary,目前,我在使用NSMutableDictionary时遇到了一个非常奇怪的问题:键值对对象的代码相同,数据相同,但结果不同 我的字典使用用户定义的类对象作为键,值是对象数组 以下是构建字典的代码: _designs = [[NSMutableDictionary alloc] init]; for (Hierarchy * hier in downloadedHierarchies.objects) { NSLog(@"Hierarchy [%d - %d - %@]", hier.de

目前,我在使用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个。甚至键也来自相同的设计(相同的设计ID),层次结构分散在这些键值对之间

一些注意事项:

  • 设计已经实现了NSCopying以及isEqual,并测试了ok

  • 层次结构还实现了NSCopying

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


我做错了什么?

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

等质量: 返回一个布尔值,该值指示接收器和给定对象是否相等。(必选)

  • (BOOL)isEqual:(id)一个对象 参数 对象 要与接收器进行比较的对象。 返回值 如果接收器和对象相等,则为是,否则为否
讨论 此方法定义实例相等的含义。例如,一个容器对象可能会将两个容器定义为相等,如果它们对应的对象都对isEqual:请求响应YES。有关此方法的使用示例,请参见NSData、NSDictionary、NSArray和NSString类规范


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

[\u designs setObject:array forKey:aDesign]中密钥应该是字符串而不是对象。嗨,samfisher,根据苹果公司的说法,密钥可以是符合NSCopying协议的对象。所以我相信这不是问题所在。大卫,你才是真正的男人。添加hash方法可以解决这个问题。然而,我决定从一开始就不实现hash方法,因为我认为默认情况下它应该返回相同的值,因此实现isEqual就足够了。