【问题标题】:Same object saved to NSUserDefaults over and over again when the NSMutableDictionary is different当 NSMutableDictionary 不同时,相同的对象一遍又一遍地保存到 NSUserDefaults
【发布时间】:2013-06-27 23:34:32
【问题描述】:

这让我发疯,我做了一个日志,发现对象不同,但是当我从NSUserDefaults 回来时,所有对象都是相同的。 我的代码:

- (void)breakTrapsToSave:(NSDictionary*)trapsDict firstTimeUpdate:(Boolean)firstTimeUpdate
{
    // If traps already save
    // we will get them from NSUserDefaults
    // and then update them
    if (!firstTimeUpdate)
    {
        allTraps = [self.sharedPrefs objectForKey:@"arrayOfAllTraps"];
    }

    // JSON Parsing
    tempA = trapsDict[@"Envelope"];
    tempB = tempA[@"Body"];
    tempC = tempB[@"getTrapsResponse"];
    tempD = tempC[@"getTrapsResult"];
    tempE = tempD[@"TRAPS"];

    self.lastUpdate = tempE[@"lastUpdate"];
    [[NSUserDefaults standardUserDefaults] setObject:self.lastUpdate forKey:@"last_update"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"Traps latest updated at: %@", self.lastUpdate);

    tempF = tempE[@"TRAP"];

    if (tempF.count <= 0)
    {
        newTrapsUpdates = false;
        NSLog(@"NO NEW TRAPS!");
    }
    else
    {
        newTrapsUpdates = true;
        NSLog(@"NEW TRAPS FOUND");

        [tempF enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            tempA = tempF[idx];
            NSString *finalResult;
            NSString *key;
            NSMutableDictionary *singleTrap = [[NSMutableDictionary alloc] init];

            for (int i=0; i < node.count; i++)
            {
                finalResult = tempA[node[i]];
                key = node[i];

                if ([finalResult length] <= 0)
                {
                    finalResult = @"0";
                }
                singleTrap[key] = finalResult;
            }

            if (allTraps.count <= 0)
            {
                allTraps = [[NSMutableArray alloc] initWithObjects:singleTrap, nil];
            }
            else
            {
                [allTraps addObject:singleTrap];
            }
            counter = idx;
        }];

        allTraps = [[IDANNetroads sharedInstance] removeDuplicatedFromArray:allTraps];

        // Save all traps
        [[NSUserDefaults standardUserDefaults] setObject:allTraps forKey:@"arrayOfAllTraps"];
        [[NSUserDefaults standardUserDefaults] synchronize];

        NSLog(@"Total Traps: %d", allTraps.count);
        NSLog(@"Total New Traps: %d", counter);
    }
}

我做了一个日志,我看到 allTraps[idx] = singleTrap; 应该是不同的,但是当我打印 NSLog(@"allTraps: %@", allTraps); 的日志时,我看到所有对象都是最后一个对象。

编辑:

最终,我替换了 singleTrap 分配,现在它位于枚举块内:

NSMutableDictionary *singleTrap = [[NSMutableDictionary alloc] init];

我添加了这段代码:

if (allTraps.count <= 0)
            {
                allTraps = [[NSMutableArray alloc] initWithObjects:singleTrap, nil];
            }
            else
            {
                [allTraps addObject:singleTrap];
            }

所以,最终的代码被编辑了。

【问题讨论】:

    标签: ios objective-c arrays dictionary nsuserdefaults


    【解决方案1】:

    无论singleTrap 是什么,您都在反复修改它,并将对同一对象的另一个引用存储在您的allTraps 数组中。您需要为 allTraps 列表中的每个条目创建(实例化)一个新项目。


    看起来singleTrap是一个字符串数组,所以试试:

    allTraps[idx] = [singleTrap copy];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2017-02-15
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多