NSUserDefaults无法保存NSMutableDictionary
Iam试图用这个代码保存NSMutableDictionary到NSUserDefaults:
NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; NSMutableDictionary *repositoryData = [[NSMutableDictionary alloc] init]; [repositoryData setObject:personData forKey:@"persondata"]; [def setObject:repositoryData forKey:@"kUserRepository"]; [def synchronize]; [repositoryData removeAllObjects]; [repositoryData release];
但是我得到这个味精:
[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{ persondata = "<Person: 0x1ed57e70>"; }' of class '__NSDictionaryM'. Note that dictionaries and arrays in property lists must also contain only property values.
还有Person类有NSCoding:
Person.h
@interface Person : NSObject <NSCoding> { NSString *name; NSString *email; NSString *phoneNumber; NSString *gender; int age; } @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *email; @property (nonatomic, retain) NSString *phoneNumber; @property (nonatomic, retain) NSString *gender; @property (assign) int age; @end
Person.m
@implementation Person @synthesize name,email,phoneNumber,age,gender; #pragma mark #pragma mark NSCoder - (void)encodeWithCoder:(NSCoder *)encoder{ [encoder encodeObject:self.name forKey:@"username"]; [encoder encodeObject:self.email forKey:@"useremail"]; [encoder encodeObject:self.phoneNumber forKey:@"userphonenumber"]; [encoder encodeObject:self.gender forKey:@"usergender"]; [encoder encodeInt:self.age forKey:@"userage"]; } - (id)initWithCoder:(NSCoder *)decoder { if(self = [super init]){ self.name = [decoder decodeObjectForKey:@"username"]; self.email = [decoder decodeObjectForKey:@"useremail"]; self.phoneNumber = [decoder decodeObjectForKey:@"userphonenumber"]; self.gender = [decoder decodeObjectForKey:@"usergender"]; self.age = [decoder decodeIntForKey:@"userage"]; } return self; } @end
任何想法为什么发生?
有什么types的数据可以同步到NSDictionary
NSUserDefaults
有非常具体的限制。 这些包括NSString, NSNumber, NSData, NSArray and NSDictionary
。 在存储到NSUserDefaults
之前,使用NSCoder
方法序列化为NSData
(使用NSKeyedArchiver
)。
另外,看看这个