iphone xcode; mutableCopy仍然是不可变的?

时间:2010-12-06 04:21:13

标签: iphone xcode nsmutablearray

我已经找到了关于这个问题的所有地方。我要做的就是创建一个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方法'

2 个答案:

答案 0 :(得分:5)

来自documentation

  

即使您将可变对象设置为值,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!