我有以下声明:
//.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 :(得分:0)
您需要确保已创建dataArray
。把它放在你班级的init
方法或其他任何合适的方法中:
dataArray = [[NSMutableArray alloc] init];
另外,我希望你的iPhone有很多内存,因为你的代码漏了很多。
答案 1 :(得分: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];
当你完成解析时,还要重新启动它们......
不要检查我的答案是否正确,但是,thinklax值得用于思考代码......
要填充UITableView,您确实需要完成一些UITableView示例,并了解它们如何加载数据。
答案 2 :(得分:0)
在您的代码中,您有多个alloc
个。这些需要与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];
}
请注意,我还在autorelease
添加了copy
。 copy
很有用,因为它会创建对象的不可变副本,在这种特殊情况下可能就是你所追求的。但是,在创建副本时,您是副本的所有者,并且您有责任释放它。当您使用dataArray
添加时,item
阵列将获得addObject:
副本的所有权,但您仍必须通过释放它来放弃您的所有权。但是,在我们将它提供给数组之前,我们不能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];
}