ios - 为什么 NSUserDefaults 无法在 iOS 中保存 NSMutableDict

我想在 NSUserDefaults 中保存一个 NSMutableDictionary 对象。 NSMutableDictionary 中的键类型是 NSString,值类型是 NSArray,其中包含实现 NSCoding 的对象列表>。每个文档,NSStringNSArray 都符合 NSCoding

我收到此错误:

[NSUserDefaults setObject: forKey:]: Attempt to insert non-property value.... of class NSCFDictionary.

最佳答案

我发现了一种替代方法,在保存之前,我使用 NSKeyedArchiver 对根对象(NSArray 对象)进行编码,它以 NSData 结尾。然后使用 UserDefaults 保存 NSData

当我需要数据时,我读出NSData,并使用NSKeyedUnarchiverNSData 转换回对象。

这有点麻烦,因为我每次都需要与 NSData 进行转换,但它确实有效。

以下是每个请求的一个示例:

保存:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];

加载:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

数组中的元素实现

@interface CommentItem : NSObject<NSCoding> {
    NSString *value;
}

然后在CommentItem的实现中,提供了两个方法:

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:value forKey:@"Value"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self.value = [decoder decodeObjectForKey:@"Value"];
    return self;
}

谁有更好的解决方案?

谢谢大家。

关于ios - 为什么 NSUserDefaults 无法在 iOS 中保存 NSMutableDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471830/

相关文章:

ios - 当我在 UITextField 中按返回键时如何隐藏键盘?

ios - 如何在 iOS 8 中强制 View Controller 方向?

ios - 调整 UITableView 的大小以适应内容

objective-c - 声明一个 block 方法参数而不使用 typedef

objective-c - 如何将字符串转换为 double ,反之亦然?

ios - 以编程方式滚动 UIScrollView

objective-c - 拆分一个 NSString 以访问一个特定的片段

ios - 在 Objective-C 中从 NSMutableArray 中删除重复值的最佳方法是

ios - 如何以编程方式获取 iphone 的 MAC 地址

objective-c - Objective-C 中的 NSString 标记化