gpt4 book ai didi

ios - 如何有效地使用 NSMutableDictionaries 作为字典的键?

转载 作者:行者123 更新时间:2023-12-01 17:32:41 25 4
gpt4 key购买 nike

我想使用 NSMutableDictionary实例作为另一个 NSMutableDictionary 的键.

    NSMutableDictionary *stuff = [NSMutableDictionary dictionary];
NSMutableDictionary *first = [NSMutableDictionary dictionary];
[stuff setObject:@"A" forKey:first];
NSLog(@"I GOT %@",[stuff objectForKey:first]);

这将输出 @"A" ,正如预期的那样,这很好。

但是,如果之后我修改 first 中的值像这样的对象:
[first setObject:@"C" forKey:@"Something"];

我现在无法获取 @"A" :
NSLog(@"I GOT %@",[stuff objectForKey:first]);

哪个输出 nil .

我假设 objectForKey会将键的内存地址与字典中的现有键进行比较 - 因为尽管更改了字典的内部值(我认为),但这样的内存地址不会改变,我希望它会起作用。

我设法让它用不同的方法工作——改为使用 NSString s 键 - 字符串的值将是内存地址本身,如下所示:
    NSMutableDictionary *stuff = [NSMutableDictionary dictionary];
NSMutableDictionary *first = [NSMutableDictionary dictionary];
[stuff setObject:@"A" forKey:[NSString stringWithFormat:@"%p",first]];
[first setObject:@"C" forKey:@"Something"];
NSLog(@"I GOT %@",[NSString stringWithFormat:@"%p",first]);

哪个有效,打印 @"A" .

我的问题:
  • 为什么我原来的方法不起作用?
  • 最佳答案

    字典在设置时获取其键的副本(并且该副本是不可变的)。然后,当您更改用于 key 的对象时,它和副本不再比较相等:NSDictionary使用 hashisEqual:检查 key 时。 (集合在这些方法中不使用对象的地址来确定它们是否相等,即使它们相等,副本和原始地址也不同。)因此您无法检索该值。如果您将字典重新更改为原来的样子,则检索将成功。

    您想出的字符串技巧是一个很好的解决方法;您也可以使用 +[NSValue valueWithNonRetainedObject:]以此目的。由于键字典的地址在您对其进行变异时不会改变,因此您仍然可以获得相同的值以供以后查找。

    关于ios - 如何有效地使用 NSMutableDictionaries 作为字典的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009725/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com