NSKeyedArchiver 和 NSValue - 如何存档?

Posted

技术标签:

【中文标题】NSKeyedArchiver 和 NSValue - 如何存档?【英文标题】:NSKeyedArchiver and NSValue - How to Archive? 【发布时间】:2010-04-24 20:09:25 【问题描述】:

如何归档 NSValues 数组?我应该进行哪些转换才能做到这一点?它不会按原样存档。

代码:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver 
archivedDataWithRootObject:[[NSArray alloc] initWithArray:drawingsArray]] 
forKey:@"NSValuesArray"];

错误:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'

数组数据:

drawingsArray (
    (
    NSPoint: 439, 280,
    NSPoint: 439, 280,
    NSPoint: 439, 287,
    NSPoint: 438.62, 290.104,
    NSPoint: 439, 293
)

)

【问题讨论】:

根据文档,NSValue 实现了NSCoding 协议,所以它应该可以正常工作。你遇到了什么问题? 代码我已经贴出来了,请看上面。 【参考方案1】:

您不需要使用NSKeyedArchiver。相反,只需说[[NSUserDefaults standardUserDefaults] setObject:valueArray forKey:@"valueArray"]。归档将自动完成。看看这是否有效。

编辑:我认为您的具体问题是使用archivedDataWithRootObject:。你不需要使用它,因为NSArray 符合NSCoder——子对象也将被自动归档。

【讨论】:

我也有这个问题。 NSPoint 是一个结构体,NSKeyedArchiver 不能编码结构体。

以上是关于NSKeyedArchiver 和 NSValue - 如何存档?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过添加指针和整数来创建 NSValue?

NSNumber和NSValue

Object - C 值对象 NSNumber和NSValue

Swift 3 中的 NSValue(CMTime: )?

将 CoreData 中的 Array<NSValue> 保存为可转换属性

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