NSUserDefaults无法保存NSMutableDictionary

时间:2013-01-11 16:53:37

标签: iphone ios objective-c nsdictionary

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 Class也有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

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

对于NSUserDefaults内可以同步到NSDictionary的数据类型,存在非常具体的限制。其中包括NSString, NSNumber, NSData, NSArray and NSDictionary。在存储NSCoder之前,使用NSData方法序列化为NSKeyedArchiver(使用NSUserDefaults)。

另外,请查看this