NSUserDefaults中的可变对象

我创build了一个简单的数据库,并放入NSUserDefaults。 我的数据库是NSMutableArray里面有字典和数组。 当我从NSUSerDefaults创buildNSMutableArray时,我无法将任何对象添加到我的NSMutableArray中的可变对象中。 这是我的代码:

NSMutableArray *arrayOne = [NSMutableArray arrayWithContentsOfFile:[self createEditableCopyOfIfNeededWithFileName:@"Form.plist"]]; NSUserDefaults *ayarlar = [NSUserDefaults standardUserDefaults]; [ayarlar setObject:arrayOne forKey:@"form"]; NSMutableArray *arrayTwo = [NSMutableArray arrayWithArray:[[ayarlar objectForKey:@"form"] mutableCopy]]; [[[arrayTwo objectAtIndex:0] objectForKey:@"itemlar"] addObject:@"hop"]; 

这里是错误:

'NSInternalInconsistencyException',原因:' – [__ NSCFArray insertObject:atIndex:]:发送给不可变对象的变异方法'

我怎样才能做这个工作? 谢谢大家。

NSUserDefaults不是存储数据的正确位置。 首先,它只能用于非常less量的数据,如设置。 其次它总是返回不可变的对象,即使你设置了可变的对象。 制作第一个数组的可变副本不起作用,因为只有数组是可变的。 该数组内的所有东西都不会被mutableCopy方法所触及并保持不变。

您应该使用NSPropertyListSerialization类从文件中读取和写入数据。 在阅读你可以传递选项控制读取对象的可变性。 在那里您将要传递NSPropertyListMutableContainers或NSPropertyListMutableContainersAndLeaves。

首先你所有的容器(数组和字典)都是可变的。 后者也叶(即NSString和NSData对象)将是可变的。

取决于你的数据集可以得到多大,你可能应该使用一个真正的数据库或核心数据。

NSUserDefaults永远不会返回可变对象。

你的代码正在执行创build一个你可以想到的可变数组的每一种方式(即你正在创build一个你刚创build的可变副本的可变副本),但是,你只处理根容器的项目 – 而不是内/叶项目。 所以,当你在可变数组上使用objectForKey:@"itemlar"] ,你会得到一个不可变的对象。

为了使它工作,你需要编写自己的方法,迭代和recursion通过在所有级别创build可变副本的数组。

另外,你可以看看这样的第三方选项,在NSUserDefaults挖掘生成可变容器。

NSUserDefaults和属性列表通常不会logging可变性。 当从文件重新创build对象时,可以将其构造为可变对象或不可变对象(对于具有选项的types(如数组))。 不幸的是, NSUserDefaults不会给你一个API调用来直接获得一个不可变的对象。

你有两个select是:(a)创build一个由NSUserDefaults返回的对象的可变副本,或者(b)把你自己的对象作为一个属性列表存储在一个单独的文件中 – 这样你可以直接读取它作为mutable。

对于(b)阅读苹果的文档 – 它显示了如何处理可变性。

你可以直接使用方法insertObject来做。

代替

 [[[arrayTwo objectAtIndex:0] objectForKey:@"itemlar"] addObject:@"hop"]; 

用这个,

 [arrayTwo insertObject:@"hop" atIndex:0]; 

这将工作,因为我已经testing它也工作finr之后,你可以使它作为NSARRAY作为不可变的对象,并将其保存到NSUSERDEFAULTS