我已经找到了关于这个问题的所有地方。我要做的就是创建一个nsuser默认对象,然后向它添加一个可变数组并尝试修改nsuserdefaults对象。
//Created a sample array
NSMutableArray *xml=[[NSMutableArray alloc] init];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
//assigned to defaults object which is created previously with a mutableCopy
[defaults setObject:[xml mutableCopy] forKey:@"userLocationsDetailedXML"];
//Tried to modify the defaults object - which at this point should be mutable
[[defaults objectForKey:@"userLocationsDetailedXML" ] replaceObjectAtIndex:1 withObject:@"y"] ;
添加[defaults synchronize]
也没有帮助。
但令人惊讶的是,默认对象仍然是不可变的。它是__NSCFArray,而不是预期的__NSCFArrayM 有什么建议吗?
编辑:控制台输出 分类:__ NSCFArray =>因为我创建了一个可变副本,所以它不是_ NSCFArrayM吗? [ _NSCFArray replaceObjectAtIndex:withObject:]:发送到不可变对象的mutating方法'
答案 0 :(得分:5)
即使您将可变对象设置为值,NSUserDefaults返回的值也是不可变的。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey:检索的字符串将是不可变的。
另外,你有一个相当丑陋的泄漏;您是mutableCopy
返回的对象的所有者,但您无法放弃所有权,因为您丢失了对该对象的唯一引用(xml
数组无论如何都是可变的。)
答案 1 :(得分:1)
尝试使用
将数组转换为NSMutableArray[(NSMutableArray *)[defaults objectForKey:@"userLocationsDetailedXML"] replaceObjectAtIndex:1 withObject:@"y"] ;
应该照顾它。
编辑:
鉴于您无法在NSUserDefaults
中实际存储NSMutableArrays,我建议您继续并重新分配整个事情,如下所示:
NSMutableArray *xml = [[NSMutableArray alloc] init];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[defaults setObject:xml forKey:@"userLocationsDetailedXML"];
[xml release];
然后,要更改值,
NSMutableArray *userLoc = [[defaults objectForKey:@"userLocationsDetailedXML"] mutableCopy];
[userLoc replaceObjectAtIndex:1 withObject:@"y"];
[defaults setObject:userLoc forKey:@"userLocationsDetailedXML"];
[userLoc release]; //thanks, dreamlax!