在NSMutableArray中保存时,值将被覆盖

时间:2012-06-29 09:58:50

标签: iphone objective-c ipad

我正在使用键“username”在NSMutableDictionary中保存用户信息,然后将此Dictionary保存在另一个带有键“name”的NSMutableDictionary中,然后将Dictionary保存在NSMutableArray中。但问题是每当我用不同的用户名保存另一个用户时,它会覆盖NSMutableArray中的值。以下是我正在使用的代码

-(void) saveUserData:(NSString *)username 

{     NSLog(@“\ nsaveDataBarButtonTapped \ n”);

NSLog(@"the count is %d",[[[ArraysManager sharedInstance] getTotalUserArray] count]);

NSLog(@"ArraysManager description is  %@ ",[[[ArraysManager sharedInstance] getTotalUserArray] description]);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString *userArrayFilePath = [[NSString alloc] initWithString:[directory stringByAppendingPathComponent:@"userData"]];

if (username.length != 0)
{
    [dataDictionary setObject:[NSString stringWithFormat:@"%@",username] forKey:@"username"];
    [dataDictionary setObject:[NSString stringWithFormat:@"%lf",totalValue] forKey:@"totalValue"];
    [dataDictionary setObject:[NSString stringWithFormat:@"%lf",totalPayable]  forKey:@"totalPayable"];

    [userDictionary setObject:dataDictionary  forKey:@"userDictionary"];

    [[[ArraysManager sharedInstance] getTotalUserArray] addObject:userDictionary];
    [[[ArraysManager sharedInstance] getTotalUserArray] writeToFile:userArrayFilePath atomically:NO];

    [dataDictionary removeAllObjects];
    [userDictionary removeAllObjects];

    NSLog(@"ArraysManager description is  %@ ",[[[ArraysManager sharedInstance] getTotalUserArray] description]);
}

else 
{
    UIAlertView *noNameAlertView = [[UIAlertView alloc] initWithTitle:@"No Name Found" 
                                                              message:@"Please Enter the User Name" 
                                                             delegate:self 
                                                    cancelButtonTitle:@"Ok" 
                                                    otherButtonTitles:nil, nil];
    [noNameAlertView show];
    [noNameAlertView release];
}

}

4 个答案:

答案 0 :(得分:1)

我认为你应该写:

 [userDictionary setObject:dataDictionary  forKey:username];

(其实我不明白你为什么这样做;

[[[ArraysManager sharedInstance] getTotalUserArray] addObject:userDictionary];

好像你每次都要添加相同的字典。)

答案 1 :(得分:0)

我认为你在两种情况下使用相同的密钥保存,因此它访问同一个数组,你需要更改不同字典的密钥。

编辑:

[userDictionary setObject:dataDictionary  forKey:[NSString stringWithFormat:@"name%d,nameCount"]];

答案 2 :(得分:0)

[dataDictionary removeAllObjects];
[userDictionary removeAllObjects];

我认为上述两个对象都是成员变量,并且您正在重用这些成员变量来向数组添加数据。从字典中删除对象不会创建新的字典对象,但会在相同的内存位置进行更新。你的数组将有多个词典和子词典,但所有这些都在同一个内存位置都有2个对象。

使用这些作为局部变量,而不是这些成员变量。 在此方法中初始化它们并将它们添加到数组中。 稍后在此方法结束前释放它们。

希望有所帮助

答案 3 :(得分:0)

您正在addObject使用相同的NSMutableDictionary对象。

您是否在count之后检查了addObject媒体资源?

为了快速修复,只需将copy字典添加到数组中。

[[[ArraysManager sharedInstance] getTotalUserArray] addObject:[[userDictionary copy] autorelease];

(非{ARC配置autorelease