2013-07-23 36 views
-2

我有一個問題,字典timeStamps將所有數值以null。鑰匙都很好,即使我把鑰匙轉換成價值,反之亦然。無論訂單如何,數值最終爲null,並且鍵完全按照他們的要求結束。添加鍵/值對結果與空鍵的值

這是代碼。這是一個XML解析器。它正在構建一個字典,其中包含一組用於鍵的代碼和一組值的時間戳。鍵和值是表示類別的平行數組。

所有變量分配和其他地方開始。這會導入包含所有這些變量作爲屬性的頭文件。 @property (strong, nonatomic) Type variableName;然後在主文件中它有行@synthesize variableName。另外,它有variableName = [[Type alloc] init];。謝謝大家的幫助!

- (void) didStartElement (elementname is passed as xml tag) 
{ 
    //Tells us if we are in the dance categories 
    if ([elementName isEqualToString:@"categories"]) 
    { 
     isCategory = YES; // Just tells us we're ready to start reading 

    } 
    else if ([elementName isEqualToString:@"category"] && isCategory) 
    { 
     onCategory = YES; // 
    } 
} 


- (void) foundCharacters (currentNodeContent is the info between tags) 
{ 
    currentNodeContent = (NSMutableString *) string; 
} 


- (void) didEndElement 
{ 
    // if leaving dance categories 
    if ([elementName isEqualToString:@"Category End"]) 
    { 
     isCategory = NO; // We've left a category 
    } 
    else if ([elementName isEqualToString:@"code"] && onCategory) 
    { 
     Code    = currentNodeContent; 
     currentNodeContent = nil; 
     isWaitingForTime = YES; 
    } 

    else if ([elementName isEqualToString:@"time"] && isWaitingForTime) 
    { 
     [runningList  addObject:Code]; 
     [runningList addObject:currentNodeContent]; 

     isWaitingForTime = NO; 
     currentNodeContent = nil; 
     Code    = @""; 
    } 

    else if ([elementName isEqualToString:@"dances"]) 
    { 
     [timeStamps setObject:runningTimeList forKey:runningList]; 
     [runningTimeList removeAllObjects]; 
     [runningList  removeAllObjects]; 
    } 
} 
+2

你真的實例化了數組嗎? – Wain

+0

作爲背景,爲什麼你使用字符串*數組作爲你的鍵和值類型?或者你想他們只是字符串? – CRD

+1

由於您從未實際創建過字典,因此從字典中提取值的調用返回nil。 –

回答

0

我不知道你實際上問在這裏,但讓我們看看以下任何幫助。

首先考慮根據你的代碼片段此方法:

- (void) test 
{ 
    NSMutableArray *Array1 = [NSMutableArray new]; 
    NSMutableArray *Array2 = [NSMutableArray new]; 

    [Array1 addObject:@"Hello"]; 
    [Array1 addObject:@"There"]; 
    [Array2 addObject:@"Hi"]; 
    [Array2 addObject:@"Welcome"]; 

    NSMutableDictionary *dictionaryOfArrays = [NSMutableDictionary new]; 

    [dictionaryOfArrays setObject:Array2 forKey:Array1]; 

    // arrays are ordered, use key with elements in different order to show this 
    [dictionaryOfArrays setObject:Array2 forKey:@[@"There", @"Hello"]]; 

    NSLog(@"dictionary: %@", dictionaryOfArrays); 
} 

這將輸出到控制檯:

dictionary: { 
     (
     There, 
     Hello 
    ) =  (
     Hi, 
     Welcome 
    ); 
     (
     Hello, 
     There 
    ) =  (
     Hi, 
     Welcome 
    ); 
} 

的表明關鍵可以是一個數組 - 和訂單陣列中的元素很重要。

但是你真的要使用數組作爲鍵?雖然作爲數組很常見,但該鍵並不常見也是一個數組。

你說你得到()或「null」。那麼第一個可能是一個沒有元素的數組 - 它與沒有數組是不同的。至於第二個,您不能將nil存儲在NSDictionary中,但是如果您查找不存在的密鑰的值,則返回nil - 即返回nil意味着不存在的密鑰。

最後,在情況下,它是相關的,當一個鍵/值對被添加到詞典中的關鍵是複製而值是簡單地引用。這意味着如果您使用可變對象作爲關鍵字,例如一個NSMutableString實例,那麼對象的後續突變不會影響字典。但是,如果(鍵/值對的值)是可變對象,則查找操作將返回與插入操作完全相同的對象,該對象可能在插入後發生了變化。

你添加到你的問題的代碼根本就沒有澄清。

希望在這裏有所幫助。

+0

謝謝!這絕對是相關的。值被引用解決了我的問題。你知道是否有任何方法將該值複製到字典中? –

+0

解決方案:'[timeStamps setObject:[[NSMutableArray alloc] initWithArray:runningTimeList copyItems:YES] forKey:runningList];' –

1

您必須初始化數組和字典。
這應該工作:

NSMutableArray *Array1 = [NSMutableArray new]; 
NSMutableArray *Array2 = [NSMutableArray new]; 

[Array1 addObject:@"Hello"]; 
[Array2 addObject:@"Hi"]; 

NSMutableDictionary *dictionaryOfArrays = [NSMutableDictionary new]; 

[dictionaryOfArrays setObject:Array2 forKey:Array1]; 

NSLog(@"dictionary: %@", dictionaryOfArrays); 

如果您計劃只存儲一個對象在同一時間,你不必創造陣列,爲了做到這一點。您可以在此方法中設置實際的NSString,因爲它將任何id作爲對象並將字符串作爲關鍵字。

否則,你應該使用的方法setObjects:forKeys:,而不是這一個。

+0

我仍然有點不清楚,爲什麼,如果Array1和Array2都是_not_ null,當我將它們添加到字典中時,無論哪個值是哪個值以及哪個是關鍵字,值總是以null結尾。 –

+0

這可能與ARC有關,但它經常發生。我不知道爲什麼它釋放價值而不是關鍵。 –

0

的問題是,您要設置一個可變的數組作爲字典的關鍵。數組被複制並存儲到字典中。如果您不更改陣列,objectForKey:將始終返回您正在尋找的值。但是,如果向它添加任何對象,則數組會發生變化,並且不會與存儲在字典中的副本相等。

從它好像你並不需要一個詞典。在所有的代碼,你只是使用字典存儲每一個結果,所以你可能想用一個NSMutableSetNSMutableArray更換timeStamps

PS:還記得添加副本runningTimeList,而不是原始數組。這是因爲每次結束元素時都不會創建數組,所以只需清空它。這意味着所有鍵都指向同一個數組。

+0

對不起,只是一些澄清:你是說如果我添加鍵/值對字典,然後更改字典外的鍵或值,字典的變化?因爲當我做字典的NSLog的時候,所有的鍵都按照他們的意思出來,但是這些值都是空的。所以有些東西是設置值而不是鍵的東西... –

+0

不,它不會改變值,但是當你調用objectForKey時:它會返回nil,因爲數組已經從原來存儲爲鍵。你每次都會清空runningTimeList而不是重新創建另一個數組,所以你的字典只是指向同一個對象的一堆鍵。在這絕對不是這樣的情況下使用字典。 –