1

我有以下声明:

 //.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在表格视图单元格中显示数据。

4

3 回答 3

0

您需要确保dataArray已创建。把它放在你班级的init方法或其他任何合适的地方:

dataArray = [[NSMutableArray alloc] init];

另外,我希望你的 iPhone 有很多内存,因为你的代码泄漏了很多。

于 2010-01-13T05:38:08.350 回答
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];

当你完成解析时也释放它们......

不过,不要检查我的答案是否正确,dreamlax 值得称赞的是思考代码......

要填充 UITableView,您确实需要完成一些 UITableView 示例并查看它们如何加载数据。

于 2010-01-13T05:55:58.607 回答
0

在您的代码中,您有许多allocs。这些都需要平衡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所有权,但您仍然必须通过释放它来放弃您的所有权。但是,我们不能在将其提供给数组之前将其释放,否则副本将在提供给之前被释放,因此它是自动释放的。保证自动释放的对象至少在该方法的其余部分中仍然存在。itemaddObject:releaseitemdataArray

自动发布的替代方法是手动跟踪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];
    }
于 2010-01-13T06:08:33.607 回答