NSMutabledictionary无法正常工作

时间:2014-06-09 12:47:42

标签: ios objective-c

我正在开发一个iPad应用程序,对于这个应用程序,我有一个功能如下: -

-(void)testcurrentest:(NSMutableDictionary *)keydictionary{
     NSArray *allKeys = [keydictionary allKeys];
     if ([allKeys count] > 0) {
         for(int i = 0;i< allKeys.count;i++){
             [_currenies removeAllObjects];
             NSString *product  = [NSString stringWithFormat:@"%@", [keydictionary objectForKey:allKeys[i]]];
             int kl = [productPriceSeasonCode intValue];
             for(int i =0;i<kl;i++){
                   [_currenies addObject:@"0"];

             }
             NSLog(@"................%@",_currenies);
             [_currencydictionary1 setObject:_currenies forKey:allKeys[i]];
             NSLog(@"full dictionary...%@",_currencydictionary1);
          }
     }
}

此处,NSLog根据kl整数值打印货币数组,但是当我尝试设置NSMutableDictionary种货币时,可变数组始终显示最新的数组值。

3 个答案:

答案 0 :(得分:1)

您对所有值使用相同的数组,如果您不想更改一个值以影响其他值,则它们应该是唯一对象。在每个循环步骤初始化_currenies或在准备新对象时使用其深拷贝。

一些代码:

[_currenies removeAllObjects]; // < The same array you've added to dict on previous loop steps

在每个循环步骤中创建一个新数组将为所有键值对创建一个唯一对象:

_currenies = [NSMutableArray array]; // < Note it is not retained, apply memory management depending on your project configuration

答案 1 :(得分:1)

你的代码乱七八糟。正如其他人所指出的那样,你在2个嵌套循环中使用相同的循环索引,这使得很难说出你的意图。不要那样做。这是一种糟糕的编程风格。

您还要创建一个永远不会使用的字符串“product”,并在每次通过外部循环时获取相同的productPriceSeasonCode整数值。我怀疑你打算获取一个随你的keydictionary中的每个条目而变化的值。

然后,你有一个数组_currenies,你在每次通过你的外循环时都会清空它。然后,为它添加一些“0”字符串,将_currencydictionary1字典中的键/值对设置为该数组的内容,然后重复。由于每次都重复使用_currenies数组,因此在_currencydictionary1字典中创建的每个键/值对都指向完全相同的数组,您不断更改该数组。在外部循环的最后一次迭代中,_currencydictionary1中的所有条目都将指向您的_currenies数组,该数组将包含您放在那里的最后一组内容。

为每个外部数组传​​递创建一个新数组,并将新创建的数组添加到_currencydictionary1。您希望_currencydictionary1的每个键/值对中都有一个唯一的数组。

简而言之,NSMutableDictionary工作得很好。这是你的代码无法正常工作。

答案 2 :(得分:0)

不是答案,但评论没有格式化 这个问题应该提供有关输入和所需输出的更多信息。

首先简化代码,找到错误应该更容易:

-(void)testcurrentest:(NSMutableDictionary *)keydictionary{
    NSArray *allKeys = [keydictionary allKeys];
    for(NSString *key in allKeys) {
        [_currenies removeAllObjects];
        int kl = [productPriceSeasonCode intValue];
        for(int i =0; i<kl; i++){
            [_currenies addObject:@"0"];
        }
        NSLog(@"................%@",_currenies);
        _currencydictionary1[key] = _currenies;
        NSLog(@"full dictionary...%@",_currencydictionary1);
    }
}

注意:product从未使用过。