具有 NSNumber 到 NSString 映射的 NSDictionary 是非属性列表对象
Posted
技术标签:
【中文标题】具有 NSNumber 到 NSString 映射的 NSDictionary 是非属性列表对象【英文标题】:NSDictionary with NSNumber to NSString mapping is non-property-list object 【发布时间】:2014-03-28 05:11:42 【问题描述】:以下代码:
[[NSUserDefaults standardUserDefaults] setObject:photoIdToPath forKey:@"photo_id_to_path"];
给我以下错误:
Attempt to set a non-property-list object
417675729 = "/Users/k06a/Library/Application Support/iPhone Simulator/7.1/Applications/21163736-DF6F-4E79-8196-6A966C81ED1B/Documents/417675729";
as an NSUserDefaults value for key photo_id_to_path
这是来自 Xcode 调试控制台的photoIdToPath
字典内容分析:
(lldb) po photoIdToPath
417675729 = "/Users/k06a/Library/Application Support/iPhone Simulator/7.1/Applications/21163736-DF6F-4E79-8196-6A966C81ED1B/Documents/417675729";
(lldb) po [[[photoIdToPath allKeys] lastObject] class]
__NSCFNumber
(lldb) po [[[photoIdToPath allValues] lastObject] class]
NSPathStore2
所以NSPathStore2
是NSString
的子类,为什么这个字典不是属性列表?
更新:
这里https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUserDefaults/setObject:forKey:我找到了文字:
value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。请参阅“什么是属性列表?”在属性列表编程指南中。
【问题讨论】:
***.com/questions/20753529/… 你的 photoIdToPath 是字典...把它改成字符串 将密钥设置为 NSString 后,尝试将值显式设置为 NSString 而不是 NSPathStore2 并查看是否保存。 @CharanGiri 无需将字典更改为字符串。只有密钥需要从NSNumber
更新为NSString
。
【参考方案1】:
您可以将字典保存到 NSUserDefaults
(或将字典作为 plist 写入文件)的唯一方法,所有键必须是 NSString
对象,所有值必须是有效的 plist 对象。
换句话说,您不能拥有NSNumber
对象的键。如果您需要将字典写入NSUserDefaults
,请将它们转换为NSString
。
有关这方面的详细信息,请参阅Property List Programming Guide。特别是标题为What is a Property List? 的部分。有一个表格显示了使用的 XML 标记。在该表下,您将看到以下摘录:
虽然 NSDictionary 和 CFDictionary 对象允许它们的键是任何类型的对象,但如果键不是字符串对象,则集合不是属性列表对象。
【讨论】:
你能提供参考链接吗? +1。错误Attempt to set a non-property-list object
明确指出该对象与属性列表不兼容。
@Chris 但是错误并不清楚问题是因为密钥不是NSString
。我知道我在某个地方的文档中看到过它,但到目前为止我找不到参考。
@rmaddy true,错误不明确。然而,奇怪的是,Apple 的文档说 NSNumber 应该是一个有效的 plist 对象developer.apple.com/library/ios/documentation/cocoa/reference/…
@Chris 值可以是NSNumber
,但不能是键。我刚找到它。我将在一分钟内用链接更新我的答案。以上是关于具有 NSNumber 到 NSString 映射的 NSDictionary 是非属性列表对象的主要内容,如果未能解决你的问题,请参考以下文章
iPhone SDK:NSString NSNumber IEEE-754
在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration
InvalidFirebaseData Swift 3 只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。