2011-07-13 52 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

相關問題