NSMutableDictionary
と呼ばれるを設定するシングルトンクラスがありcompletedLevels
ます。
これは私がそれを設定するinit
方法です(私のシングルトンの方法で):
NSString *mainPath = [[NSBundle mainBundle] bundlePath];
NSString *levelConfigPlistLocation = [mainPath stringByAppendingPathComponent:@"levelconfig.plist"];
NSDictionary *levelConfig = [[NSDictionary alloc] initWithContentsOfFile:levelConfigPlistLocation];
completedLevels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levelSets = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *stats = [[NSMutableDictionary alloc]init];
[stats setObject:[NSNumber numberWithBool:NO] forKey:@"levelDone"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"stars"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"time"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"bestTime"];
for (int i = 1; i<=18; i++) {
[levels setObject:stats forKey:[NSString stringWithFormat:@"level%d", i]];
}
for(int i= 1; i<=15;i++){
NSString *lvlSet = [NSString stringWithFormat:@"levelSet%d", i];
[levelSets setObject:levels forKey:lvlSet];
}
NSArray *categoriesArray = [levelConfig objectForKey:@"categoriesArray"];
for (int i=0; i<[categoriesArray count]; i++) {
NSString *category = [[levelConfig objectForKey:@"categoriesArray"]objectAtIndex:i];
[completedLevels setObject:levelSets forKey:category];
}
私は自分の行動を説明したい:
私の意図は、次の形式で辞書を作成することでした。
category = {
levelSet1 ={
level1 ={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
level2={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
.
.
.
}
levelSet2 ={
level1 ={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
level2={
bestTime = 0;
levelDone = 0;
stars = 0;
time = 0;
};
.
.
.
}
.
.
.
}
levelSet の場合の %d は、1 から 15 までの整数です。
レベルの場合の %d は、1 から 18 までの整数です。
いくつかのカテゴリがあるため、上記の例の複数のセットがあります。
これはうまく機能し、NSLog を呼び出すと、辞書がコンソールに表示されます。ただし、次の例に示すように、辞書のいくつかのエントリを変更したい場合に問題が発生します。
NSString *category = [[GameStateSingleton sharedMySingleton]getCurrentCategory];
NSString *levelSet = [NSString stringWithFormat:@"levelSet%d",[[GameStateSingleton sharedMySingleton]getSharedLevelSet]];
NSNumber *currentLevel = [NSNumber numberWithInt:[[GameStateSingleton sharedMySingleton]getSharedLevel]];
NSString *levelString = [NSString stringWithFormat:@"level%d", [currentLevel intValue]];
NSMutableDictionary *categories = [[NSMutableDictionary alloc]initWithDictionary:
[[GameStateSingleton sharedMySingleton]getCompletedLevels]];
[[[[categories objectForKey:category]objectForKey:levelSet]objectForKey:levelString]setObject:[NSNumber numberWithBool:YES] forKey:@"levelDone"];
[[GameStateSingleton sharedMySingleton]setCompletedLevels:categories];
NSLog(@"%@",[[GameStateSingleton sharedMySingleton]getCompletedLevels]);
それを説明するには:
levelDone
プレイヤーがレベルを使い終わったら、エントリの値を変更したいと思います。しかし、後でログに記録すると、突然levelDone
、すべてのカテゴリのすべてのエントリが BOOLEAN 値 1 に変わります。なぜですか?
- - - - - - - - - - アップデート - - - - - - - - - - - -
completedLevels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levelSets = [[NSMutableDictionary alloc]init];
NSMutableDictionary *levels = [[NSMutableDictionary alloc]init];
NSMutableDictionary *stats = [[NSMutableDictionary alloc]init];
[stats setObject:[NSNumber numberWithBool:NO] forKey:@"levelDone"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"stars"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"time"];
[stats setObject:[NSNumber numberWithInt:0] forKey:@"bestTime"];
for (int i = 1; i<=18; i++) {
NSMutableDictionary *statsCopy = [stats mutableCopy];
[levels setObject:statsCopy forKey:[NSString stringWithFormat:@"level%d", i]];
[statsCopy release];
}
for(int i= 1; i<=15;i++){
NSString *lvlSet = [NSString stringWithFormat:@"levelSet%d", i];
NSMutableDictionary *levelsCopy = [levels mutableCopy];
[levelSets setObject:levelsCopy forKey:lvlSet];
[levelsCopy release];
}
NSArray *categoriesArray = [levelConfig objectForKey:@"categoriesArray"];
for (int i=0; i<[categoriesArray count]; i++) {
NSString *category = [[levelConfig objectForKey:@"categoriesArray"]objectAtIndex:i];
NSMutableDictionary *levelSetsCopy = [levelSets mutableCopy];
[completedLevels setObject:levelSetsCopy forKey:category];
[levelSetsCopy release];
}
取得して設定する部分は同じままでした...
__ _ __ _ _ __ _ __ _ __ ソリューション _ __ _ __ __ _ __ _ _ ____ _ _ _
NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)originalDictionary, kCFPropertyListMutableContainers);
この方法でディープコピーを作成しました。