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 )。

另外,看看这个