2013-02-11 32 views
0

我遇到了一個奇怪的問題,其中NSDictionary存儲到NSUserDefaults,然後檢索它將它轉換爲NSCFStringNSDictionary變成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是一本字典,但由於某些原因,它被轉換爲字符串。

任何想法或建議嗎?謝謝!

+2

你可能不能充分'retain'(或'strong')你的字典,它沿途的某個地方去拜拜。 – 2013-02-11 22:20:50

+0

雖然請注意,在一種情況下,您正在打印「targetsDict」,而在另一個「trackableDict」中 - 尚未深入分析它以查看trackableDict可能來自哪裏。 – 2013-02-11 22:23:26

+0

啊,是的。你只是使用錯誤的機制來遍歷字典。正如這兩個答案所示。 – 2013-02-11 22:24:58

回答

5

的NSDictionary的快速列舉返回鍵,而不是值。

for (NSDictionary *trackableDict in targetsDict) {

在這裏你遍歷所有的鍵。更改

NSLog(@"LOAD Trackable %@ %@", [trackableDict class], trackableDict); 

NSLog(@"LOAD Trackable %@ %@", [trackableDict class], targetsDict[trackableDict]); 
+0

哦,對了,傻了。謝謝! – prisonerjohn 2013-02-11 22:53:11

4
for (NSDictionary *trackableDict in targetsDict) 

for構造迭代通過鍵而不是值。因此,要獲得價值,你必須要麼

for (NSDictionary *trackableDict in [targetsDict allValues]) 

for (NSString *trackableKey in targetsDict) 
{ 
    NSDictionary *trackableDict = targetsDict[trackableKey]; 
    ..... 
}