0

それは私を夢中にさせています。ログを作成したところ、オブジェクトが異なっていることがわかりましたが、から戻ったとき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];
            }

したがって、最終的なコードは編集されます。

4

1 に答える 1

2

いずれにせよsingleTrap、それを繰り返し変更し、同じオブジェクトへの別の参照をallTraps配列に格納しています。リストに必要なエントリごとに新しいアイテムを作成 (インスタンス化) する必要がありますallTraps


singleTrap文字列の配列のように見えるので、試してください:

allTraps[idx] = [singleTrap copy];
于 2013-06-30T21:14:42.357 に答える