我有一个plist,它的根源是一个带有dictonaries的数组。
我从我的资源中加载一个plist作为NSMutableArray。
[NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"plist"]]
我将它存储到nsuserdefault中,因为它必须在启动之间保持不变。
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"filters"];
但我无法更改数组中的dictonaries,因为它们不可变。我怎么能让它们变得可变?
答案 0 :(得分:5)
使用“mutabilityOption:NSPropertyListMutableContainersAndLeaves”进行检查,这使您可以非常精确地控制哪些元素作为静态添加,哪些元素添加为可变元素。从物业清单程序员指南:
如果需要对属性列表中对象的可变性进行更细粒度的控制,请使用propertyListFromData:mutabilityOption:format:errorDescription:class方法,其第二个参数允许您指定对象在各个级别的可变性。聚合属性列表。您可以指定所有对象都是不可变的(NSPropertyListImmutable),只有容器(数组和字典)对象是可变的(NSPropertyListMutableContainers),或者所有对象都是可变的(NSPropertyListMutableContainersAndLeaves)。
例如,您可以编写如下代码:
NSMutableArray *dma = (NSMutableArray *)[NSPropertyListSerialization
propertyListFromData:plistData
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&error];
此调用生成一个可变数组(dma),每个元素中都包含可变字典。每个字典中的每个键和每个值本身也是可变的。
答案 1 :(得分:1)
您可以使用NSDictionary的'mutableCopy'方法,通过自身的可变副本替换字典。
[编辑]示例:
[array replaceObjectAtIndex:42 withObject:[[[array objectAtIndex: 42] mutableCopy] autorelease]];