Iphone 将NSMutableDicItory填充到NSMutableArray中
我有以下声明:Iphone 将NSMutableDicItory填充到NSMutableArray中,iphone,objective-c,nsmutablearray,nsmutabledictionary,Iphone,Objective C,Nsmutablearray,Nsmutabledictionary,我有以下声明: //.h file: NSMutableArray *dataArray; NSMutableDictionary *item; //.m file - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName at
//.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
数据。您需要确保创建了dataArray
。将其放在类的init
方法中,或者放在其他合适的地方:
dataArray = [[NSMutableArray alloc] init];
另外,我希望你的iPhone有很多内存,因为你的代码有点泄漏。要解决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];
- (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];
}
- (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];
}
并且在完成解析后重新设置它们的状态
不要检查我的答案是否正确,dreamlax值得赞扬它对代码的思考
要填充UITableView,您确实需要浏览一些UITableView示例,看看它们是如何加载数据的。在您的代码中,有许多
alloc
s。这些需要与发行版
相平衡。您还有一个副本
,需要与版本
平衡。如果不释放这些对象,最终会一次又一次地分配新对象,最终会耗尽内存
您需要做的是找出代码中适合发布它们的位置。当您不再需要分配的对象时,应该释放它们。在您的情况下,在-(void)解析器中添加以下代码可能是明智的:didEndElement:namespaceURI:qualifiedName:
方法,如下所示:
[item release]; [currentEid release]; [currentEname release]; [currentEurl release];
item = [[NSMutableDictionary alloc] init];
currentEid = [[NSMutableString alloc] init];
currentEname = [[NSMutableString alloc] init];
currentEurl = [[NSMutableString alloc] init];
- (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];
}
- (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];
}
请注意,我还向您的副本添加了一个自动释放
copy
很有用,因为它创建了对象的不可变副本,在这种情况下,它可能就是您所要的。但是,创建副本时,您是副本的所有者,并负责发布副本。当您使用addObject:
添加数据数组时,您的dataArray
数组将获得您的项
副本的所有权,但您仍必须通过释放它来放弃所有权。但是,在将项提供给数组之前,我们不能释放它,否则项
副本将在提供给数据数组
之前解除分配,因此它将自动释放。自动释放的对象保证至少在方法的剩余部分存活
自动删除的另一种方法是手动跟踪项
副本,如下所示:
[item release]; [currentEid release]; [currentEname release]; [currentEurl release];
item = [[NSMutableDictionary alloc] init];
currentEid = [[NSMutableString alloc] init];
currentEname = [[NSMutableString alloc] init];
currentEurl = [[NSMutableString alloc] init];
- (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];
}
- (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];
}
嘿,谢谢!!!DreamLax…现在开始工作了。但是我不知道泄漏的事。。它是什么???请你再帮我一次好吗。我想在表视图单元格中显示相同的dataArray。如何做到?iphone没有自动垃圾收集器,应用程序可用的内存量非常小。因此,对于每个alloc | retain | copy,您必须在应用程序中的某个地方有一个版本。为了有效地管理内存,您可以找到很多在网上和这个网站上都有文档。已经有一段时间了,你过得怎么样?我个人会避免在一行上有4个单独的语句。通常我也不会这样做,我只是想快速说明它们应该是免费的。。。然而,放置类似[项目发布]的东西是很常见的;item=单行上为零,因为它们密切相关。