2010-01-13 28 views
1

我有以下聲明:東西NSMutableDicitonary到NSMutableArray的

//.h file: 
    NSMutableArray *dataArray; 
    NSMutableDictionary *item; 

    //.m file 
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    
     currentElement = [elementName copy]; 
     if ([elementName isEqualToString:@"table"]){ 
     item = [[NSMutableDictionary alloc] init]; 
     currentEid = [[NSMutableString alloc] init]; 
     currentEname = [[NSMutableString alloc] init]; 
     currentEurl = [[NSMutableString alloc] init]; 
     } 
     //NSLog(@"didStartElement"); 
     } 

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  

     if ([elementName isEqualToString:@"table"]) { 
      // save values to an item, then store that item into the array... 
      [item setObject:currentEname forKey:@"ename"]; 
      //NSLog(@"%@",item); 
      [self.dataArray addObject:[item copy]]; 
      NSLog(@"%@",dataArray); 
      } 
    } 

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
     if ([currentElement isEqualToString:@"eid"]) { 
      [currentEid appendString:string]; 
     } else if ([currentElement isEqualToString:@"ename"]) { 
      [currentEname appendString:string]; 
      //NSLog(@"%@",currentEname); 
     } else if ([currentElement isEqualToString:@"eurl"]) { 
      [currentEurl appendString:string]; 
     } 
     // NSLog(@"foundCharacters"); 
    } 

顯示,當我得到了NSMutableArray(dataArray)空值。我怎麼能解決這個問題? 或者如果可以,請幫助我瞭解如何在表格視圖單元格中顯示NSMutableDicitonary數據。

+0

它已經一段時間了,你怎麼樣在得到一個凌晨? – dreamlax 2010-01-13 11:30:24

回答

0

您需要確保創建了dataArray。把這個類的init方法或任何其他地方要適當:

dataArray = [[NSMutableArray alloc] init]; 

而且,我希望你的iPhone擁有大量的內存,爲你的代碼泄漏公平一點。

+0

嘿,謝謝! DreamLax ...現在工作。 但我不知道泄漏..它是什麼? 請你再幫我一次。我想在表格視圖單元格中顯示相同的數據陣列。如何做到這一點? – Rohit 2010-01-13 05:47:33

+0

iphone沒有自動垃圾回收器,可用的內存量非常小。因此,對於每個alloc |保留|複製,你必須有一個釋放的地方在你的application.For有效的內存管理,你可以找到大量的文檔在網絡和也在這個網站。 – raaz 2010-01-13 06:09:41

0

爲了解決dreamlax提到的泄漏,就需要在這方面添加代碼:

item = [[NSMutableDictionary alloc] init]; 
     currentEid = [[NSMutableString alloc] init]; 
     currentEname = [[NSMutableString alloc] init]; 
     currentEurl = [[NSMutableString alloc] init]; 

像這樣的東西:

[item release]; [currentEid release]; [currentEname release]; [currentEurl release]; 
item = [[NSMutableDictionary alloc] init]; 
      currentEid = [[NSMutableString alloc] init]; 
      currentEname = [[NSMutableString alloc] init]; 
      currentEurl = [[NSMutableString alloc] init]; 

而且還reelase他們你做分析的時候。 ..

不要檢查我的答案是正確的,但dreamlax值得信貸琢磨代碼...

對於填充UITableView,你真的需要通過一些UITableView的例子,看看他們如何加載數據。

+0

我個人會避免在一行中有4個單獨的陳述。 – 2010-01-13 19:38:01

+0

通常我不會做,要麼,我只是想快速說明他們應該是免費的......不過這是相當普遍把類似[項目發佈]; item =零,因爲它們密切相關。 – 2010-01-14 00:23:54

0

在您的代碼中,您有多個alloc s。這些需要與release平衡。您還有一個copy,需要與release進行平衡。如果你不釋放這些對象,你最終會反覆分配新的對象,最終會導致內存不足。

你需要做的是找出代碼中的哪個位置是釋放它們的合適位置。當你不再需要你分配的對象時,你應該釋放它們。在你的情況下,它可能是明智的添加以下代碼在你- (void)parser:didEndElement:namespaceURI:qualifiedName:方法,像這樣:


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  
     if ([elementName isEqualToString:@"table"]) { 
      // save values to an item, then store that item into the array... 
      [item setObject:currentEname forKey:@"ename"]; 
      //NSLog(@"%@",item); 
      [self.dataArray addObject:[[item copy] autorelease]]; 
      NSLog(@"%@",dataArray); 
      } 
     [currentEid release]; 
     [currentEname release]; 
     [currentEurl release]; 
    }

請注意,我還添加了一個autoreleasecopycopy很有用,因爲它創建了一個不可變的對象副本,在這種情況下可能是您所追求的內容。但是,當您創建副本時,您是副本的所有者,您有責任將其發佈。當您將dataArray陣列與addObject:一起添加時,您的dataArray陣列將獲得您的item副本的所有權,但您仍然必須通過釋放它來放棄您的所有權。但是,我們不能在release之前將它提交給陣列,否則item副本將在釋放給dataArray之前解除分配,因此它會自動釋放。自動釋放的對象保證至少在該方法的其餘部分存活。

的替代自動釋放是手動保持的item複製的軌道,就像這樣:


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  
     if ([elementName isEqualToString:@"table"]) { 
      NSDictionary *itemCopy; 
      // save values to an item, then store that item into the array... 
      [item setObject:currentEname forKey:@"ename"]; 
      //NSLog(@"%@",item); 
      itemCopy = [item copy]; 
      [self.dataArray addObject:itemCopy]; 
      [itemCopy release]; 
      NSLog(@"%@",dataArray); 
      } 
     [currentEid release]; 
     [currentEname release]; 
     [currentEurl release]; 
    }