不正常返回的 NSMutableDictionnary 的内容
Content of a NSMutableDictionnary erratically returned
我正在尝试在 Objective-C 的字典中添加键。代码如下:
我有一个 class 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]);
}
这是我添加不同 key/values 后得到的结果:
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 的调试器查看字典的实际内容,我发现所有对 key/value 都按应有的方式存在。所以好像dict的description方法没能正确打印出一些key的值。在不使用 NSLog 但在 UITable 中显示字典内容的情况下也会发生同样的情况。另请注意,如果我尝试记录这些特定键值的地址,它也会给我 0x0(因此我的描述函数没有错误)。
请注意,行为相当混乱,有时几个值设置为零,然后在我添加几对 key/values 后它们正确显示。我真的无法解决这个问题,任何帮助将不胜感激。
编辑 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
这是一个猜测:
所提供的信息并未表明您的类型 myKey
实现了 isEqual:
和 hash
。键必须实现这些方法才能在 NSDictionary
中正常工作;如果它们未实现,将使用默认的 NSObject
实现,它们可能不会为 myKey
.
的实例产生正确的结果
您还指出使用 myKey
实例的 description
确实有效,这很有意义,因为 description
returns 一个 NSString
和那个类型实现 isEqual:
和 hash
.
HTH
我正在尝试在 Objective-C 的字典中添加键。代码如下:
我有一个 class 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]);
}
这是我添加不同 key/values 后得到的结果:
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 的调试器查看字典的实际内容,我发现所有对 key/value 都按应有的方式存在。所以好像dict的description方法没能正确打印出一些key的值。在不使用 NSLog 但在 UITable 中显示字典内容的情况下也会发生同样的情况。另请注意,如果我尝试记录这些特定键值的地址,它也会给我 0x0(因此我的描述函数没有错误)。
请注意,行为相当混乱,有时几个值设置为零,然后在我添加几对 key/values 后它们正确显示。我真的无法解决这个问题,任何帮助将不胜感激。
编辑 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
这是一个猜测:
所提供的信息并未表明您的类型 myKey
实现了 isEqual:
和 hash
。键必须实现这些方法才能在 NSDictionary
中正常工作;如果它们未实现,将使用默认的 NSObject
实现,它们可能不会为 myKey
.
您还指出使用 myKey
实例的 description
确实有效,这很有意义,因为 description
returns 一个 NSString
和那个类型实现 isEqual:
和 hash
.
HTH