Plist数组,不能改变里面的dictonaries

时间:2010-04-20 14:39:46

标签: iphone arrays dictionary plist mutable

我有一个plist,它的根源是一个带有dictonaries的数组。

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

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

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

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

但我无法更改数组中的dictonaries,因为它们不可变。我怎么能让它们变得可变?

2 个答案:

答案 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]];