3

以下代码:

[[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

这是photoIdToPath来自 Xcode 调试控制台的字典内容分析:

(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 对象,它们的内容必须是属性列表对象。请参阅“什么是属性列表?” 在属性列表编程指南中。

4

1 回答 1

13

您可以将字典保存到NSUserDefaults(或将字典作为 plist 写入文件)的唯一方法,所有键必须是NSString对象,所有值必须是有效的 plist 对象。

换句话说,您不能拥有作为NSNumber对象的键。NSString如果您需要将字典写入.,请将它们转换为NSUserDefaults.

有关这方面的详细信息,请参阅属性列表编程指南。特别是标题为什么是属性列表?. 有一个表格显示了使用的 XML 标记。在该表下,您将看到以下摘录:

尽管 NSDictionary 和 CFDictionary 对象允许它们的键是任何类型的对象,但如果键不是字符串对象,则集合不是属性列表对象。

于 2014-03-28T05:14:03.530 回答