不同的键指向NSMutableDictionary中的相同对象

时间:2011-01-12 02:30:51

标签: objective-c xcode nsmutablearray nsmutabledictionary

我有一个名为Person的自定义对象,其中包含一个名为NSString的{​​{1}}字段,该字段存储descriptor对象所属的那种人(生气,悲伤,狂野,快乐,郁闷等)。我的所有Person对象都在Person中,但我想以这样的方式将它们存储在NSMutableArray中:

键:A,对象:NSMutableDictionary所有NSMutableArray个对象的Person以“A”开头

键:B,对象:descriptor所有NSMutableArray个对象的Person以“B”开头

键:C,对象:descriptor所有NSMutableArray个对象的Person以“C”开头 等...

我尝试在下面的代码中执行此操作,并且在注释// POINT 1处,键和数组似乎匹配,但在// POINT 2,当我打印出完整的字典时,所有键得出相同的值!

所以我想知道为什么descriptor我似乎没有按照我想要的方式存储在NSMutableArray中?

NSMutableDictionary

因此,例如,在POINT 1,我的输出是:

A

愤怒

有亲和力

交战国

C

...

w ^

野生

但是在POINT 2我的输出是

Ť

野生

Ĵ

野生

A

野生

...

w ^

野生

2 个答案:

答案 0 :(得分:2)

[tempDict setObject:personsStartingWithLetter forKey:[indexList objectAtIndex:([indexList count] - 1)]];(在第1点之后)更改为[tempDict setObject:[[personsStartingWithLetter copy] autorelease] forKey:[indexList objectAtIndex:([indexList count] - 1)]];。问题是NSDictionary复制了密钥,但保留了该值。因此,如果将可变数组添加到字典然后更改它,则字典中的数组也会更改。您需要创建一个不可变的数组副本以放入字典中。

答案 1 :(得分:0)

整个方法有点过于复杂。

- (void)buildDictionaryForIndexList 
{
    NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init] autorelease];
    for (Person *v in persons)
    {
        NSString* firstLetter = [[v descriptor] substringWithRange:NSMakeRange(0, 1)];
        NSMutableArray* personsStartingWithLetter = tempDict [firstLetter];
        if (personsStartingWithLetter == nil)
        {
            personsStartingWithLetter = [NSMutableArray array];
            tempDict [firstLetter] = personsStartingWithLetter;
        }
        [personsStartingWithLetter addObject:v];
    } // for
    self.dictionary = tempDict;
}

您从一个包含数组的空字典开始。对于每个人,您检查是否有合适的数组,如果没有,则创建它。所以现在 是一个人的数组,所以你把它添加到数组中。就这样。