2011-07-13 5 views
0

NSMutablearrayにオブジェクトを追加するときに予期しない動作が発生しています。基本的に、私は配列の最後にオブジェクトを追加したい。配列内のすべてのオブジェクトは異なるはずです。しかし、私が見ているのは、配列内のすべてのオブジェクトが最後に挿入されたオブジェクトと等しいことです。関連するコードを記載しました:NSMutablearray予期しない動作:最後のオブジェクトが追加されたすべてのオブジェクト

_trafficArray = [[NSMutableArray alloc] init]; 


    int _index = -1; 
    int _currentIndex = 0; 
    int _reportCount = 0; 

TrafficReport *_report = [[TrafficReport alloc] init]; 


    while (true) { 

     if (!xmlTextReaderRead(_reader)) break; 

     switch (xmlTextReaderNodeType(_reader)) {  

      case XML_READER_TYPE_ELEMENT: 


       temp = (char *)xmlTextReaderConstName(_reader); 

       currentTagName = [NSString stringWithCString:temp encoding: NSUTF8StringEncoding]; 

       if([currentTagName isEqualToString:@"Title"]) 
       { 

        _index++; 

        temp = (char *)xmlTextReaderConstName(_reader); 

        currentTagName = [NSString stringWithCString:temp encoding: NSUTF8StringEncoding]; 


        xmlTextReaderRead(_reader); 

        temp = (char*)xmlTextReaderConstValue(_reader); 
        currentTagValue = [NSString stringWithCString:temp 
                 encoding:NSUTF8StringEncoding]; 


        _report.title = currentTagValue; 

        _reportCount++; 


       } 
       if ([currentTagName isEqualToString:@"Description"]) { 

        temp = (char *)xmlTextReaderConstName(_reader); 

        currentTagName = [NSString stringWithCString:temp encoding: NSUTF8StringEncoding]; 

        xmlTextReaderRead(_reader); 

        temp = (char*)xmlTextReaderConstValue(_reader); 
        currentTagValue = [NSString stringWithCString:temp 
                 encoding:NSUTF8StringEncoding]; 

        _report.description = currentTagValue; 
        _reportCount++; 


       } 

      if (_reportCount==2) { 


       _reportCount = 0; 

       NSLog(@"updated! with index = %d and title = %@\n\n", _index, _report.title); 



       [_trafficArray insertObject:_report atIndex:_index]; 

       [_report release]; 

    TrafficReport *_report = [[TrafficReport alloc] init]; 


      } 


      continue; 

     default:continue; 
    } 


} 

答えて

2

これは範囲の問題です。 _reportをリリースした後、if文のスコープ内に新しい_reportオブジェクトを宣言します。 whileループの前に宣言したのと同じ名前を持っていても、別の変数を参照します。代入の前に宣言(TrafficReport *)を削除して、既存の_report変数に新しい値を代入してください。

+0

これは正しい答えです。私は 'if'ステートメントでの割り当てを忘れていました。@omzは新しい変数' _report'を宣言していて、最初のものを(単純に)隠していますが、置き換えません。また、最後のTrafficReportインスタンスが適切に解放されていることを確認してください - 今はあなたがオブジェクトを漏らしていると思います。 – Caleb

+0

ありがとう、これはトリックでした。私は比較的新しいiosと客観的なCですので、このような問題は私の頭を越えることができます。 – scord

関連する問題