0

XMLドキュメントを多次元配列に変換する解析メソッドを実装しようとしていますが、次のように、その配列を多次元配列に追加した直後に配列からオブジェクトを削除する必要があることに依存しています:

while (k<blockRowArray.count){                                   //loops through all rows one by one
        NSLog(@"current k is %i", k);
        GDataXMLDocument *currentRow = (GDataXMLDocument *) [blockRowArray objectAtIndex:k];
        NSArray *arrayOfBlocks = [currentRow nodesForXPath:@"b" error:nil];
        j = 0;
        while (j <arrayOfBlocks.count) {
            NSLog(@"current j is %i",j);
            GDataXMLElement *blockElement = (GDataXMLElement *) [arrayOfBlocks objectAtIndex:j];
            NSNumber* blockValue = [NSNumber numberWithInt:[[blockElement stringValue] intValue]];
            [individualRowOfBlocks addObject:blockValue];
            j++;
        }
        k++;
        NSLog (@"Current row of blocks array is %@",individualRowOfBlocks);


        [rowBlocks addObject:individualRowOfBlocks];
        [individualRowOfBlocks removeAllObjects];
    }

ただし、空の配列のセットを含む多次元配列になるため、[individualRowOfBlocks removeAllObjects]明らかに同時にまたは前に実行されているため、これを行う方法の後に実行することを確認する必要がありますか?[rowBlocks addObject:individualRowOfBlocks][individualRowOfBlocks removeAllObjects][individualRowOfBlocks removeAllObjects]

4

1 に答える 1

1

ただし、[individualRowOfBlocks removeAllObjects] は明らかに同時または [rowBlocks addObject:individualRowOfBlocks] の前に実行されています。これは、空の配列のセットを含む多次元配列になってしまうため、[ individualRowOfBlocks removeAllObjects] は [individualRowOfBlocks removeAllObjects] の後に実行されます。

スレッド (またはキュー) が関係していない限り、Objective-C メソッドは常に、コードに記述された順序で実行されます。ただし、メソッドが明示的に呼び出されて、その実装でスレッド/キューに何かを実行する場合を除きます (そのコードでは非常にありそうもないことです)。 )。

を呼び出すたびに、同じ配列[rowBlocks addObject:individualRowOfBlocks];への新しい参照が追加されます。individualRowOfBlocks後で の内容を変更するとindividualRowOfBlocks、すべてのスロットがrowBlocksその変更を効果的に反映します。これは、すべてのスロットが配列の同じインスタンスを指しているためです。

の代わりに、ループを通過するたびにremoveAllObjectsの新しいインスタンスを作成し、 に割り当てる必要があるように聞こえます。NSMutableArrayindividualRowOfBlocks

于 2012-10-24T16:40:49.600 に答える