NSDictionary を NSUserDefualts に保存しようとしています。
ディクショナリは、3 つの異なるカスタム クラスで構成されます。
@interface PastOrder : NSObject <NSCoding>
{
NSDate *timeIn;
NSDate *timeOut;
NSString *status;
NSMutableArray *myItems;
}
@property (nonatomic, retain) NSDate *timeIn;
@property (nonatomic, retain) NSDate *timeOut;
@property (nonatomic, retain) NSString *status;
@property (nonatomic, retain) NSMutableArray *myItems;
@end
@implementation PastOrder
@synthesize timeIn, timeOut, status, myItems;
#define PastOrderTimeInKey @"PastOrderTimeInKey"
#define PastOrderTimeOutKey @"PastOrderTimeOutKey"
#define PastOrderStatusKey @"PastOrderStatusKey"
#define PastOrderMyItemsKey @"PastOrderMyItemsKey"
-(id)initWithCoder:(NSCoder*)decoder
{
self = [super init];
if(self)
{
self.timeIn = [decoder decodeObjectForKey:PastOrderTimeInKey];
self.timeOut = [decoder decodeObjectForKey:PastOrderTimeOutKey];
self.status = [decoder decodeObjectForKey:PastOrderStatusKey];
self.myItems = [decoder decodeObjectForKey:PastOrderMyItemsKey];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
[encoder encodeObject:self.timeIn forKey:PastOrderTimeInKey];
[encoder encodeObject:self.timeOut forKey:PastOrderTimeOutKey];
[encoder encodeObject:self.status forKey:PastOrderStatusKey];
[encoder encodeObject:self.myItems forKey:PastOrderMyItemsKey];
}
-(void)dealloc
{
self.timeIn = nil;
self.timeOut = nil;
self.status = nil;
self.myItems = nil;
}
@end
@interface PastOrderItem : NSObject <NSCoding>
{
NSNumber *itemID;
NSString *status;
NSMutableArray *itemChoices;
}
@property (nonatomic, retain) NSNumber *itemID;
@property (nonatomic, retain) NSString *status;
@property (nonatomic, retain) NSMutableArray *itemChoices;
@end
@implementation PastOrderItem
@synthesize itemID,status,itemChoices;
#define PastOrderItemItemIDKey @"PastOrderItemItemIDKey"
#define PastOrderItemStatusKey @"PastOrderItemStatusKey"
#define PastOrderItemItemChoicesKey @"PastOrderItemItemChoicesKey"
-(id)initWithCoder:(NSCoder*)decoder
{
self = [super init];
if(self)
{
self.itemID = [decoder decodeObjectForKey:PastOrderItemItemIDKey];
self.itemChoices = [decoder decodeObjectForKey:PastOrderItemItemChoicesKey];
self.status = [decoder decodeObjectForKey:PastOrderItemStatusKey];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
[encoder encodeObject:self.itemID forKey:PastOrderItemItemIDKey];
[encoder encodeObject:self.itemChoices forKey:PastOrderItemItemChoicesKey];
[encoder encodeObject:self.status forKey:PastOrderItemStatusKey];
}
-(void)dealloc
{
self.itemID = nil;
self.itemChoices = nil;
self.status = nil;
}
@end
@interface PastOrderItemChoice : NSObject <NSCoding>
{
NSNumber *modifierID;
NSNumber *modifierChoice;
}
@property (nonatomic, retain) NSNumber *modifierID;
@property (nonatomic, retain) NSNumber *modifierChoice;
@end
@implementation PastOrderItemChoice
@synthesize modifierID, modifierChoice;
#define PastOrderItemChoiceModifierIDKey @"PastOrderItemChoiceModifierIDKey"
#define PastOrderItemChoiceModifierChoiceKey @"PastOrderItemChoiceModifierChoiceKey"
-(id)initWithCoder:(NSCoder*)decoder
{
self = [super init];
if(self)
{
self.modifierID = [decoder decodeObjectForKey:PastOrderItemChoiceModifierIDKey];
self.modifierChoice = [decoder decodeObjectForKey:PastOrderItemChoiceModifierChoiceKey];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)encoder
{
[encoder encodeObject:self.modifierID forKey:PastOrderItemChoiceModifierIDKey];
[encoder encodeObject:self.modifierChoice forKey:PastOrderItemChoiceModifierChoiceKey];
}
-(void)dealloc
{
self.modifierID = nil;
self.modifierChoice = nil;
}
@end
これらは、この NSDictionary 内にある 3 つのクラスです。ロードして保存する方法は次のとおりです。
-(void)SavePrefs
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary];
[prefs setObject:data forKey:@"SavedOrders"];
[prefs synchronize];
}
- (id)init
{
self = [super init];
if (self)
{
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"SavedOrders"];
self.myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
return self;
}
コードを少し試してみましたが、辞書を保存すると、ロードしたときと同じ135バイトでしたが、それでも辞書がいっぱいになりませんでした。だから私は途方に暮れています。