我想在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.
发布评论