代码之家  ›  专栏  ›  技术社区  ›  Andy Jacobs

plist数组,不能在内部更改字典

  •  0
  • Andy Jacobs  · 技术社区  · 15 年前

    我有一个plist,在它的根上有一个数组,其中包含了字典。

    我从我的资源中加载一个plist作为一个非可变的数组。

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

    我将它存储到nsuserdefault中,因为它必须在初创企业之间保持不变。

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

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   Macmade    15 年前

    您可以使用nsdictionary的“mutable copy”方法将字典替换为其自身的可变副本。

    [编辑]实例:

    [数组替换对象索引:42 WithObject:[[[Array对象索引: 42]可变副本]自动释放]];

        2
  •  5
  •   David K.    13 年前

    使用“mutableoption:nspropertylistmutablecontainersandleaves”检查,可以非常精确地控制哪些元素是作为静态元素添加的,哪些元素是作为可变元素添加的。从属性列表程序指南:

    如果需要对属性列表中对象的可变性进行更精细的控制,请使用propertylistfromdata:mutableoption:format:errordescription:class方法,该方法的第二个参数允许您指定聚合属性列表各个级别上对象的可变性。可以指定所有对象都是不可变的(Nspropertylistimmutable),只有容器(数组和字典)对象是可变的(NspropertylistmableContainers),或者所有对象都是可变的(NspropertylistmableContainers和Leaves)。

    例如,您可以这样编写代码:

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

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