为什么NSUserDefaults无法在iPhone SDK中保存NSMutableDictionary?(Why NSUserDefaults failed to save NSMutableDictionary in iOS?)

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

我收到这个错误:

[NSUserDefaults setObject:forKey:]:尝试插入NSCFDictionary类的非属性值....

任何解决方案?

I'd like to save an NSMutableDictionary object in NSUserDefaults. The key type in NSMutableDictionary is NSString, the value type is NSArray, which contains a list of object which implements NSCoding. Per document, NSString and NSArray both are conform to NSCoding.

I am getting this error:

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

最满意答案

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

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

这是一个有点麻烦,因为我需要转换/从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; }

任何人都有更好的解决方案

感谢大家。

I found out one alternative, before save, I encode the root object (NSArray object) using NSKeyedArchiver, which ends with NSData. Then use UserDefaults save the NSData.

When I need the data, I read out the NSData, and use NSKeyedUnarchiver to convert NSData back to the object.

It is a little cumbersome, because i need to convert to/from NSData everytime, but it just works.

Here is one example per request:

Save:

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

Load:

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

The element in the array implements

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

Then in the implementation of CommentItem, provides two methods:

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

Anyone has better solution?

Thanks everyone.

为什么NSUserDefaults无法在iPhone SDK中保存NSMutableDictionary?(Why NSUserDefaults failed to save NSMutableDictionary in iOS?)

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

我收到这个错误:

[NSUserDefaults setObject:forKey:]:尝试插入NSCFDictionary类的非属性值....

任何解决方案?

I'd like to save an NSMutableDictionary object in NSUserDefaults. The key type in NSMutableDictionary is NSString, the value type is NSArray, which contains a list of object which implements NSCoding. Per document, NSString and NSArray both are conform to NSCoding.

I am getting this error:

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

最满意答案

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

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

这是一个有点麻烦,因为我需要转换/从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; }

任何人都有更好的解决方案

感谢大家。

I found out one alternative, before save, I encode the root object (NSArray object) using NSKeyedArchiver, which ends with NSData. Then use UserDefaults save the NSData.

When I need the data, I read out the NSData, and use NSKeyedUnarchiver to convert NSData back to the object.

It is a little cumbersome, because i need to convert to/from NSData everytime, but it just works.

Here is one example per request:

Save:

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

Load:

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

The element in the array implements

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

Then in the implementation of CommentItem, provides two methods:

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

Anyone has better solution?

Thanks everyone.