我遇到了一個奇怪的問題,其中NSDictionary
存儲到NSUserDefaults
,然後檢索它將它轉換爲NSCFString
。NSDictionary變成NSCFString
這裏就是我保存數據:
- (void)saveProgress
{
// Save our progress to the user defaults.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *progressDict = [NSMutableDictionary dictionary];
if ([defaults objectForKey:@"session_progress"] != nil) {
[progressDict addEntriesFromDictionary:[defaults dictionaryForKey:@"session_progress"]];
}
NSMutableDictionary *targetsDict = [NSMutableDictionary dictionary];
if ([progressDict objectForKey:@"targets"] != nil) {
[targetsDict addEntriesFromDictionary:[progressDict objectForKey:@"targets"]];
}
NSMutableDictionary *trackableDict = [NSMutableDictionary dictionary];
if ([targetsDict objectForKey:@"mda_sao_ext_04"]) {
[trackableDict addEntriesFromDictionary:[targetsDict objectForKey:@"mda_sao_ext_04"]];
}
[trackableDict setObject:[NSNumber numberWithBool:YES]
forKey:@"viewed"];
NSLog(@"SAVE Trackable %@ %@", [trackableDict class], trackableDict);
[targetsDict setObject:trackableDict
forKey:@"mda_sao_ext_04"];
NSLog(@"SAVE Targets %@ %@", [targetsDict class], targetsDict);
[progressDict setObject:targetsDict
forKey:@"targets"];
[defaults setObject:progressDict
forKey:@"session_progress"];
[defaults synchronize];
}
這裏的地方我加載數據顯示:loadProgress
- (NSInteger)loadProgress
{
// Load our progress from the user defaults.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"session_progress"] == nil) {
return 0;
}
NSDictionary *progressDict = [defaults dictionaryForKey:@"session_progress"];
if ([progressDict objectForKey:@"targets"] == nil) {
return 0;
}
NSDictionary *targetsDict = [progressDict objectForKey:@"targets"];
NSLog(@"LOAD Targets %@ %@", [targetsDict class], targetsDict);
NSInteger viewedCount = 0;
for (NSDictionary *trackableDict in targetsDict) {
NSLog(@"LOAD Trackable %@ %@", [trackableDict class], trackableDict);
if ([[trackableDict objectForKey:@"viewed"] boolValue]) {
++viewedCount;
}
}
return viewedCount;
}
應用崩潰。下面是輸出到控制檯:
LOAD Targets __NSCFDictionary {
"mda_sao_ext_04" = {
scanned = 1;
viewed = 1;
};
}
LOAD Trackable __NSCFString mda_sao_ext_04
您可以從第一蹤跡看到`mda_sao_ext_04是一本字典,但由於某些原因,它被轉換爲字符串。
任何想法或建議嗎?謝謝!
你可能不能充分'retain'(或'strong')你的字典,它沿途的某個地方去拜拜。 – 2013-02-11 22:20:50
雖然請注意,在一種情況下,您正在打印「targetsDict」,而在另一個「trackableDict」中 - 尚未深入分析它以查看trackableDict可能來自哪裏。 – 2013-02-11 22:23:26
啊,是的。你只是使用錯誤的機制來遍歷字典。正如這兩個答案所示。 – 2013-02-11 22:24:58