I can't figure out what is causing this. Basically, a few different 'tasks' are colliding with each other in my app. When i press a button, it runs this code just fine:
PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];
[dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]];
It can do this as many times as i like. But when i perform another task (and theres a few which cause this to happen), which involves this code for example:
PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];
[dataCenter.colourPalettesContainer removeObjectAtIndex:touchDownID];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:dataCenter.colourPalettesContainer forKey:@"container"];
[prefs synchronize];
and then:
dataCenter.colourPalettesContainer = [prefs objectForKey:@"container"];
When i run the first code again after this, it causes a crash with the "mutating method sent to immutable object" error. How can i stop this?
EDIT: So i've found out the problem from some answers below. Does anybody have a different method of doing this which they'd suggest?
NSUserDefaults
always returns immutable objects, even if what you stored was mutable. To work around this, you need to make a mutable copy. Since-mutableCopy
returns an object that the caller owns, it needs to be (auto)released:(Edit) I posted some -mutableDeepCopy NSArray & NSDictionary methods a while back, in response to another question. If your problem involves deeper nesting of collections, and you need them all to be mutable, this may help.
NSUserDefaults returns an immutable array. You need to make a mutable copy of it when you load it back up:
You might also have to do some manipulation inside of the array since you were storing NSMutableArrays within it.
TO REMOVE AN OBJECT FROM PARTICULAR INDEX OF AN ARRAY. (Swift 3.0)