-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];
    }
}
4

3 に答える 3

0

問題は、変更可能な配列を辞書のキーとして設定していることです。配列がコピーされ、ディクショナリに格納されます。配列を変更しない場合、objectForKey:常に探していた値が返されます。ただし、オブジェクトを追加すると、配列が変化し、辞書内に格納されているコピーと等しくなくなります。

コードから、辞書はまったく必要ないように見えます。辞書を使用してすべての結果を保存しているだけなのでtimeStampsNSMutableSetまたはに置き換えることができますNSMutableArray

PSrunningTimeList :元の配列ではなく、のコピーを追加することも忘れないでください。これは、要素を終了するたびに配列を作成するわけではないため、空にするだけです。これは、すべてのキーが同じ配列を指していることを意味します。

于 2013-07-24T00:35:10.903 に答える