基本的に、NSMutableDictionaryから派生したOrderedDictionaryというオープンソースコードを使用しています。次にOrderedDictionaryクラスにencodeメソッドとdecodeメソッドを追加して、順序付き辞書データをNSUserDefaultsに保存します。しかし、エンコードとデコードのメソッドが呼び出されていないことに気付きました。その結果、デコードされた辞書はもはや順序付けされません。以下は私のコードは次のとおりです。これを使用するためのNSMutableDictionaryの派生クラスでencodeWithCoderが呼び出されない
/**
* encode the object
**/
- (void)encodeWithCoder:(NSCoder *)coder
{
[super encodeWithCoder:coder];
[coder encodeObject:dictionary forKey:@"dictionary"];
[coder encodeObject:array forKey:@"array"];
}
/**
* decode the object
*/
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self != nil)
{
dictionary = [coder decodeObjectForKey:@"dictionary"];
array = [coder decodeObjectForKey:@"array"];
}
return self;
}
クイックサンプルコード:実装ファイルで
@interface OrderedDictionary : NSMutableDictionary <NSCopying, NSCoding>
{
NSMutableDictionary *dictionary;
NSMutableArray *array;
}
dictionary = [[OrderedDictionary alloc] init];
[dictionary setObject:@"one" forKey:@"two"];
[dictionary setObject:@"what" forKey:@"what"];
[dictionary setObject:@"7" forKey:@"7"];
NSLog(@"Final contents of the dictionary: %@", dictionary);
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"myDictionary"] == nil)
{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:dictionary]
forKey:@"myDictionary"];
}
else
{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedDictionary = [currentDefaults objectForKey:@"myDictionary"];
if (savedDictionary != nil)
{
OrderedDictionary *oldData = [NSKeyedUnarchiver unarchiveObjectWithData:savedDictionary];
if (oldData != nil)
{
NSLog(@"Final contents of the retrieved: %@", oldData);
}
}
}
事がされ、最終的retrievedDictionaryはオリジナルを持っていませんデータの順序とエンコードとデコードのメソッドはまったく呼び出されません。
事前にお問い合わせいただきありがとうございます。 :)
、すなわち、私たちはNSMutableDictionaryの子クラスのエンコードとデコードメソッドを呼び出すことができない場合があり.... – trillions