将NSMutableDictionary填充到NSMutableArray

时间:2010-01-13 05:13:22

标签: 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 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数据。

3 个答案:

答案 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平衡。您还需要copyrelease进行平衡。如果你不释放这些对象,你将最终一遍又一遍地分配新对象,并且最终会耗尽内存。

您需要做的是确定代码中哪个位置适合发布它们。当您不再需要分配的对象时,应释放它们。在您的情况下,在- (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添加了copycopy很有用,因为它会创建对象的不可变副本,在这种特殊情况下可能就是你所追求的。但是,在创建副本时,您是副本的所有者,并且您有责任释放它。当您使用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];
    }