Objective c NSDictionary写入文件

Objective c NSDictionary写入文件,objective-c,nsdictionary,Objective C,Nsdictionary,保存字典有大小限制吗 我正试图用writeToFile编写一个相当大的字典,其中包含大约100个键和嵌套字典:但它从不写,而且总是错误的 这是一个限制还是我做了一些不正确的事情 我使用的代码如下 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; NSS

保存字典有大小限制吗

我正试图用writeToFile编写一个相当大的字典,其中包含大约100个键和嵌套字典:但它从不写,而且总是错误的

这是一个限制还是我做了一些不正确的事情

我使用的代码如下

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *fullPath = [documentsDir stringByAppendingPathComponent:@"test.plist"];   

[myDict writeToFile: fullPath  atomically:YES];
没有大小限制(除了内存和磁盘空间)

myDict的内容是什么

如果它不是属性列表中允许的一小部分类,那么就不能使用
writeToFile:atomically:

您需要将字典限制为仅包含这些类的实例,或者需要使用不同的归档方法

特别是,许多JSON库会将
NSNULL
实例喷入集合中。那些不能存档。您需要将其编辑掉,或者将其替换为可以存档的对象

相关性:


除了只使用符合条件的对象(NSNumber、NSString、NSData等实例)外,还有一个技巧,密钥必须是NSString对象。通常,您可以将任何对象用于NSDictionary密钥,但要成功写入文件:NSDictionary中的密钥必须是实例NSString。

我还要添加一个在Lion上遇到的技巧。在调用NSDictionary的
writeToFile:atomically:
之前,必须存在要将plist写入的文件夹。您可以使用NSFileManager来测试是否存在,并在必要时创建一个新文件夹。

正如其他人所提到的,字典无法与某些数据类型(值得注意的空值)一起保存

因为我的字典来自一个服务器(以JSON的形式),所以我无法保证字典中包含什么,所以在JSON序列化之前,我保存了原始数据(来自dataWithContentsOfURL)。为此,我猜想您可以将dict转换为NSData并保存它—类似于

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict];
然后像这样检索并转换回来

NSDictionary *JSONDict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:convertedDATA];

您确定字典树中没有嵌入任何不可编码的对象吗。符合NSCoding的对象集有限。在控制台中检查一下,我有一种感觉,如果是这样的话,它会将有问题的对象细节吐到那里。我也有同样的问题,问题是字典中的[NSNull null]对象:)@yasirmturk-就是这样!谢谢。我在使用writeToFile保存NSDictionary时遇到问题,这个答案帮助我解决了问题。像这样的怪癖可以是如此愚蠢的浪费时间进行故障排除。想确认这确实解决了我的问题!我使用了NSNumber作为键,但字典在将数字转换为字符串后就不会写了!谢谢,@Otuken!