NSUserDefaults fail to save NSMutableDictionary

2019-05-19 08:25发布

问题:

Iam trying to save NSMutableDictionary to NSUserDefaults with this code:

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];

But i am getting this msg:

    [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.

and also the Person Class have 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

Any idea why it happen?

回答1:

There are very specific restrictions as to what type of data can be synced to NSUserDefaults within an NSDictionary. These include NSString, NSNumber, NSData, NSArray and NSDictionary. Use your NSCoder methods to serialize to NSData (using NSKeyedArchiver) before storing in the NSUserDefaults.

Also, take a look at this