【问题标题】:Content of a NSMutableDictionnary erratically returnedNSMutableDictionnary 的内容不规律地返回
【发布时间】:2015-03-12 22:17:01
【问题描述】:

我正在尝试在 Objective-C 的字典中添加键。代码如下:

我有一个类 MyClass,其头文件包含:

@property (nonatomic) NSMutableDictionary *dict;

初始化如下:

_dict = [[NSMutableDictionary alloc] init];

然后我尝试向它添加键:

- (void) addOrModify:(myKey*) key withValue:(myValue *) value {
[self.dict setObject:value forKey:key];
NSLog(@"Adding the key %@ %p with value %@ %p",[key description],key,[value description],value);
NSLog(@"%@",[self.dict description]);
}

这是我在添加不同的键/值时得到的结果:

Adding the key (key1) 0x7f9dc3590070 with value (value1) 0x7f9dc358e760
{
"(key1)" = "(value1)";
}

Adding the key (key2) 0x7f9dc357adc0 with value (value2) 0x7f9dc357de20
{
"(key2)" = (null);
"(key1)" = "(value1)";
}

Adding the key (key3) 0x7fa4d2cbdbd0 with value (value3) 0x7fa4d2d53cf0
{
"(key3)" = "(value3)";
"(key2)" = "(value2)";
"(key1)" = "(value1)";
}

现在,如果我使用 XCode 的调试器查看字典的实际内容,我会发现所有键/值对都按应有的方式存在。因此,似乎dict的描述方法无法正确打印某些键的值。在不使用 NSLog 但在 UITable 中显示字典内容的情况下也会发生同样的情况。另请注意,如果我尝试记录这些特定键的值的地址,它也会给我 0x0(所以我的描述函数没有错误)。

请注意,这种行为相当混乱,有时有几个值设置为 nil,然后在我添加了几对键/值后它们会正确显示。我真的无法解决这个问题,任何帮助将不胜感激。

编辑 1

我的钥匙界面

@interface myKey : NSObject <NSCopying>
@property(nonatomic, copy) NSString *myKeyName;
@property(nonatomic) float myKeyFloat;
@property(nonatomic, readonly, strong) NSDate *dateCreated;

我的价值观的接口:

typedef NS_ENUM(NSInteger, Unities) { g, kg, };
@interface myValue : NSObject
@property(nonatomic) float myValueFloat;
@property(nonatomic) Unities myValueUnit;

调用代码

- (IBAction)addKeyValue:(id)sender { 
myValue *value = [myValue randomValue]; 
myKey *key =[[CatalogKeys sharedCatalogKeys] 
getRandomKeyFromStore]; [self.dict addOrModify:key withValue: value]; 
}

其中 randomValue 只是将 myValueUnit 设置为 'g' 并在 myValueFloat 中放置一个随机浮点数

【问题讨论】:

  • 如果您将myKeymyValue 类型的定义至少与调用addOrModify 的代码一起添加到您的问题中,它将帮助人们帮助您。
  • 我也尝试过使用我的代码,但找不到解决此问题的明确方法。我发现的唯一一件事是,如果我将 [key description] 而不是 key 添加到字典中,问题就会消失。然后我将类 myKey 减少为仅包含一个 NSString 但问题再次出现。最让我困惑的是 NSLog 打印的内容和我在调试器中看到的内容之间的差异......

标签: cocoa nsdictionary nsmutabledictionary


【解决方案1】:

这是一个猜测:

提供的信息并未显示您的类型myKey 实现了isEqual:hash。密钥必须实现这些方法才能在NSDictionary 中正常工作;如果它们未实现,则将使用默认的 NSObject 实现,并且它们可能不会为 myKey 的实例产生正确的结果。

您还指出使用myKey 实例的description 确实有效,这是有道理的,因为description 返回一个NSString,并且该类型实现了isEqual:hash

HTH

【讨论】:

  • 太棒了!!我实现了散列函数(仅通过 keyName 散列)并且效果很好!非常感谢。顺便说一句:我错了或者 NSDictionnary 类文档没有指定这个哈希定义约束?
  • NSDictionary 声明它使用isEqual:,如果查找它的定义声明“如果两个对象相等,它们必须具有相同的哈希值。最后一点特别如果您在子类中定义 isEqual: 并打算将该子类的实例放入集合中,这很重要。请确保您还在子类中定义哈希。“所以它就在那里,但不是直接在 NSDictionary 文档中。
猜你喜欢
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多