Вопрос

i'm getting [__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object when I try to edit an object which I get from NSUserDefault.

I have searched through stackoverflow and tried making the mutable copy after retrieving the data but still getting the error. Here is the current code

I set this in the first view controller

        NSMutableArray *settings=[[NSMutableArray alloc]init];

        [settings addObject:[@{
                               @"single":@"Player1",
                               @"multiplesame":[[NSMutableArray alloc] initWithObjects:@"Player1",@"Player2",@"Player3",@"Player4",@"Player5", nil],
                               @"multipleDiff":[UIDevice currentDevice].name

                              }mutableCopy]];   

       [Reusables storeArrayToDefaults:SETTINGS_DETAILS objectToAdd:settings];

Now in another view controller, I'm trying to change the value of Player1 of single key to a name. For that this is how I retrieve the data.

NSMutableArray *setDetails = [[[NSUserDefaults standardUserDefaults] arrayForKey:SETTINGS_DETAILS] mutableCopy];

//setDetails= [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:SETTINGS_DETAILS]] ;
//setDetails = [setDetails mutableCopy];

 NSLog(@"Details:%@",setDetails);

The log prints fine

Details:(
        {
        multipleDiff = "iPhone Simulator";
        multiplesame =         (
            Player1,
            Player2,
            Player3,
            Player4,
            Player5
        );
        single = Player1;
    }
)

But now when I try to change the value like this it gets crashed with the above error

 [[setDetails objectAtIndex:0] setObject:@"Any Name" forKey:@"single"] ;

For reference this is how I save in NSUserDefaults

+(void)storeArrayToDefaults :(NSString *)keyName objectToAdd:(NSMutableArray *)arrayData

{

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:arrayData forKey:keyName];

    [defaults synchronize];
}
Это было полезно?

Решение 2

Everything in NSUserDefaults is immutable. You create a mutable copy of the outer container but its contents are still immutable. So, to edit them, you need to take a mutable copy, update that and then reinsert (and re-add to defaults).

[[setDetails objectAtIndex:0] setObject:@"Any Name" forKey:@"single"];

changes to

NSMutableDictionary *dict = [[setDetails objectAtIndex:0] mutableCopy];
[dict setObject:@"Any Name" forKey:@"single"];
[setDetails replaceObjectAtIndex:0 withObject:dict];

Другие советы

Try this

 NSMutableArray *setDetails = [NSMutableArray arrayWithArray:[[[NSUserDefaults standardUserDefaults] arrayForKey:SETTINGS_DETAILS] mutableCopy]];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[setDetails objectAtIndex:0]];
[dict setObject:@"Any Name" forKey:@"single"];
[setDetails replaceObjectAtIndex:0 withObject:dict];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top