0

我有一个 plist,它的根是一个数组,里面有字典。

我从我的资源中加载一个 plist 作为 NSMutableArray。

[NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Filters" ofType:@"plist"]]

我将它存储到 nsuserdefault 中,因为它必须在启动之间保持不变。

[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"filters"];

但我无法更改数组中的字典,因为它们不可变。我怎样才能使它们可变?

4

2 回答 2

5

使用“mutabilityOption:NSPropertyListMutableContainersAndLeaves”查看,这可以让您非常精确地控制哪些元素添加为静态元素以及哪些元素添加为可变元素。从属性列表程序员指南:

如果您需要对属性列表中对象的可变性进行更细粒度的控制,请使用 propertyListFromData:mutabilityOption:format:errorDescription: 类方法,其第二个参数允许您在聚合属性列表的各个级别指定对象的可变性. 您可以指定所有对象都是不可变的(NSPropertyListImmutable),只有容器(数组和字典)对象是可变的(NSPropertyListMutableContainers),或者所有对象都是可变的(NSPropertyListMutableContainersAndLeaves)。

例如,您可以编写如下代码:

NSMutableArray *dma = (NSMutableArray *)[NSPropertyListSerialization
                        propertyListFromData:plistData
                        mutabilityOption:NSPropertyListMutableContainersAndLeaves
                        format:&format
                        errorDescription:&error];

此调用生成一个可变数组 (dma),每个元素中都有可变字典。每个字典中的每个键和每个值本身也是可变的。

于 2011-05-26T19:33:44.323 回答
1

您可以使用 NSDictionary 的“mutableCopy”方法将字典替换为自身的可变副本。

[编辑] 示例:

[数组replaceObjectAtIndex:42 withObject:[[[数组objectAtIndex:42] mutableCopy]自动释放]];

于 2010-04-20T14:43:42.370 回答