如何将带有 NSValue 对象的 NSDictionary 保存到文件中

Posted

技术标签:

【中文标题】如何将带有 NSValue 对象的 NSDictionary 保存到文件中【英文标题】:How to save an NSDictionary with NSValue objects to a file 【发布时间】:2020-08-04 17:01:00 【问题描述】:

我有一个平面 NSDictionary,其中键作为 NSNumber 对象,值作为 NSValue 对象。如何将其保存到文件中?

我尝试将字典直接写入文件并归档到 NSData,但都失败了。

// Try 1: Archive
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionary];

// Try 2: Write to file
[dictionary writeToFile:filePath atomically:YES];

NSValue 对象包含字符串指针。

[NSValue valueWithPointerString:text];

【问题讨论】:

为什么要用NSValue封装NSString对象?你有错误吗?使用writeToFile:options:error: 来获得更明确的错误(而不是 bool 呢?) 【参考方案1】:

你可以把它写成一个属性列表,但是你需要用例如替换 NSNumber 键。字符串和 NSValue 对象必须是“家族的一部分”。如果您可以通过这些要求,这是一个不错的选择,您应该认真考虑。

然后就可以加载了

dict = [NSDictionary dictionaryWithContentsOfURL...

并保存

[dict writeToUrl...

这很好,很简单,没有当今 NSSecureCoding 的复杂性。

否则,您需要深入研究密钥归档器并确保密钥和对象都实现 NSCoding / NSSecureCoding。即使在这里,它也可以很快成为一项任务,但它是具有自定义对象的字典的“正常”路线。编辑:如果你使用 NSString 和 NSNumber 你应该没有问题。

但是,如果您有自定义对象,例如您的值是一些不实现 NSCoding 的奇怪东西,那么您必须查阅文档中的 Archives and Serializations Programming Guide。无论如何,您都可以去那里选择这些选项中的任何一个,但目前最简单的可能是第一个?

【讨论】:

以上是关于如何将带有 NSValue 对象的 NSDictionary 保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章

性能 - NSValue 中的结构与容器对象

使用正确的类型将 NSValue 转换为 NSData 并再次返回

NSNumber 与NSValue

如何将弱引用对象存储在数组中,字典中的objc?

如何在 Swift 3 中将字典表示为 NSValue?

Object - C 值对象 NSNumber和NSValue