Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将NSMutableDicItory填充到NSMutableArray中_Iphone_Objective C_Nsmutablearray_Nsmutabledictionary - Fatal编程技术网

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=单行上为零,因为它们密切相关。