NSUserDefaults内部的可变对象

Ula*_*cak 1 database objective-c nsuserdefaults nsmutablearray ios

我创建了一个简单的数据库,并放入了NSUserDefaults。我的数据库是NSMutableArray,其中包含字典和数组。从NSUSerDefaults创建NSMutableArray时,无法将任何对象添加到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"];
Run Code Online (Sandbox Code Playgroud)

这是错误:

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

我该如何进行这项工作?谢谢大家。

Sve*_*ven 5

NSUserDefaults不是存储数据的正确位置。首先,它仅应用于少量数据,例如设置。其次,即使您设置了可变对象,它也总是返回不可变的对象。制作第一个数组的可变副本无济于事,因为只有数组是可变的。mutableCopy方法不会触及该数组中的所有内容,并且保持不变。

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

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

根据数据集的大小,您可能应该使用真实的数据库或Core Data。