NSUserDefaults没有保存完整的Object

时间:2016-02-02 18:00:38

标签: ios objective-c ios7 ios-simulator

我在使用NSUserDefaults时遇到过一些麻烦。

我有一个自定义类对象,我用它来解析API的响应。该类符合NSCoding并实现initWithCoder和encodeWithCoder。

在SiteGroup.h文件中:

@interface SiteGroup : NSObject <NSCoding>
 @property (nonatomic, assign) int SiteGroupID;
 @property (nonatomic, assign) int StatusID;
 @property (nonatomic, copy) NSString *StatusDesc;
 @property (nonatomic, copy) NSString *SiteGroupName;
 @property (nonatomic, copy) NSString *City;
 @property (nonatomic, copy) NSString *State;
 @property (nonatomic) Country *SiteGroupCountry;
 @property (nonatomic, copy) NSString *LocalConference;
 @property (nonatomic, copy) NSString *Address;
 @property (nonatomic, copy) NSString *ClosestAirport;
 @property (nonatomic, copy) NSString *Coordinates;
 @property (nonatomic, copy) NSString *Latitude;
 @property (nonatomic, copy) NSString *Longitude;
 @property (nonatomic, copy) NSString *Altitude;
 @property (nonatomic, copy) NSString *Accuracy;
 @property (nonatomic, copy) NSArray *SiteGroupEvents;
 @property (nonatomic, copy) NSArray *Sites;

在SiteGroup.m文件中:

- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (!self) {
    return nil;
}
self.SiteGroupID = [decoder decodeIntForKey:@"SiteGroupID"];
self.SiteGroupName = [decoder decodeObjectForKey:@"SiteGroupName"];
self.City = [decoder decodeObjectForKey:@"City"];
self.State = [decoder decodeObjectForKey:@"State"];
self.SiteGroupCountry = [decoder decodeObjectForKey:@"SiteGroupCountry"];
self.LocalConference = [decoder decodeObjectForKey:@"LocalConference"];
self.Address = [decoder decodeObjectForKey:@"Address"];
self.ClosestAirport = [decoder decodeObjectForKey:@"ClosestAirport"];
self.Coordinates = [decoder decodeObjectForKey:@"Coordinates"];
self.Latitude = [decoder decodeObjectForKey:@"Latitude"];
self.Longitude = [decoder decodeObjectForKey:@"Longitude"];
self.Altitude = [decoder decodeObjectForKey:@"Altitude"];
self.Accuracy = [decoder decodeObjectForKey:@"Accuracy"];
self.SiteGroupEvents = [decoder decodeObjectForKey:@"SiteGroupEvents"];
self.Sites = [decoder decodeObjectForKey:@"Sites"];
self.StatusID = [decoder decodeIntForKey:@"StatusID"];
self.StatusDesc = [decoder decodeObjectForKey:@"StatusDesc"];
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInt:self.SiteGroupID forKey:@"SiteGroupID"];
[encoder encodeObject:self.SiteGroupName forKey:@"SiteGroupName"];
[encoder encodeObject:self.City forKey:@"City"];
[encoder encodeObject:self.State forKey:@"State"];
[encoder encodeObject:self.SiteGroupCountry forKey:@"SiteGroupCountry"];
[encoder encodeObject:self.LocalConference forKey:@"LocalConference"];
[encoder encodeObject:self.Address forKey:@"Address"];
[encoder encodeObject:self.ClosestAirport forKey:@"ClosestAirport"];
[encoder encodeObject:self.Coordinates forKey:@"Coordinates"];
[encoder encodeObject:self.Altitude forKey:@"Altitude"];
[encoder encodeObject:self.Accuracy forKey:@"Accuracy"];
[encoder encodeObject:self.SiteGroupEvents forKey:@"SiteGroupEvents"];
[encoder encodeObject:self.Sites forKey:@"Sites"];
[encoder encodeInt:self.StatusID forKey:@"statusID"];
[encoder encodeObject:self.StatusDesc forKey:@"statusDesc"];
}

一旦我完成解析它就会被添加到NSMutableArray中。然后我检查一下该数组的大小是否大于0,如果是,我将它存储到NSUserDefaults中。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithArray:tempSiteGroupList]];
    [userDefaults setObject:data forKey:@"SiteGroupArray"];
    [userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:tempSiteGroup] forKey:@"SiteGroup"];

    [userDefaults synchronize];

数组确实被保存到NSUserDefaults中,但奇怪的是,我的自定义类的所有属性都没有保存,有些属性,有些则没有。 这是我用来为NSUserDefaults带回数组的代码:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize];
NSData *data = [userDefaults objectForKey:@"SiteGroupArray"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
return myArray;

即使某些其他属性正常,也不会保存StatusID,StatusDesc,Latitude,Longitude和SiteGroupID。

感谢您的帮助,我从未遇到过这种情况,也许我一直都在做错事。

2 个答案:

答案 0 :(得分:2)

您展示的代码不会对LatitudeLongitude ...

进行编码

答案 1 :(得分:1)

StatusIDStatusDesc具有不同的密钥(@"StatusID"用于解码@"statusID"用于编码,同样适用于StatusDesc用于解码和编码,在与CRD同时声明您不对LatitudeLongitude进行编码和解码。