NSMutableArray丢失数据

时间:2014-01-16 15:59:58

标签: objective-c nsmutablearray

这里已经有很多关于这个问题的帮助,但没有一个实现有效。即:使用self.myArray创建(非原子,保留)+,使用字典而不是数组。

我正在做的是从xml文档中解析信息,过滤掉不需要的条目,并尝试动态存储该条目的信息。

当我尝试将信息存储到2个mutableArrays中时,其中一个信息在尝试访问“解析器”方法之外的信息时会丢失。

一些背景代码。不是完整的代码。 (这也有字典)

·H

@interface WikiView : UIViewController {
    //scrollview
    UIScrollView *ScrollView;

    //init
    int isIpad;
    int orientation;
    int parseCount;

    //parse data constructs
    NSString *subplant;
    NSString *element;
    NSMutableString *text;
    NSString *oldElement;
    NSMutableDictionary *dataHolder;
    NSMutableArray *dataGroup;
    NSMutableArray *dataText;

}
@end

的.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    //inits
    dataGroup = [[NSMutableArray alloc] init];
    dataText = [[NSMutableArray alloc] init];
    dataHolder = [[NSMutableDictionary alloc] initWithCapacity:1];

    text = [[NSMutableString alloc] init];

    //parse the info 
    [self loadDataFromXML:xmlpath];

    //When I call the values for dataText here they are all null
    //also when called the objects for dataHolder are null as well

    //this outputs the correct array
    for (int i = 0; i<[dataGroup count]; i++) {
        NSLog(@"%@",dataGroup[i]);
    }
    //this outputs an array of null objects
    for (int i = 0; i<[dataText count]; i++) {
        NSLog(@"HI.....%@",dataText[i]);
    }
}

//parse function
//method to retrieve data
- (void)loadDataFromXML:(NSString *)xmlpath {
    //data is parsed
    NSData* data = [NSData dataWithContentsOfFile: xmlpath];
    NSXMLParser* parser = [[NSXMLParser alloc] initWithData: data];

    [parser setDelegate:self];

    [parser parse];

    [parser release];
}



//on found characters
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if ([subplant isEqualToString:plantid]) {

        NSString *s2 = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

        if (![oldElement isEqualToString:element]) {

            if (oldElement != nil) {
                if (parseCount >= 1) {

                    //Here I store the values into the proper places

                    NSLog(@"%@: %@",oldElement,text);
                    [dataGroup addObject:oldElement];
                    [dataText addObject:text];
                    [dataHolder setObject:text forKey:oldElement];

                    //The values are correct here
                }
                parseCount++;
            }

            //if (new tag) reset string
            [text setString:s2];
        }
        else{
            //if not new tag append string (takes care of &apos;)
            [text appendString:s2];
        }

        oldElement = element;
    }
}

//on did start element
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    //accessing tags of this element
    if ([elementName isEqualToString:@"plant"]) {
        subplant = [attributeDict valueForKey:@"plant"];
    }
    element = elementName;
}

-(void)dealloc{
    [super dealloc];
    [text release]; [dataGroup release]; [dataText release]; [dataHolder release];
}

我以完全相同的方式创建dataGroup和dataText,但只有dataText失去其值。

感谢任何帮助,如果我的代码的任何部分不清楚,请告诉我。

编辑:

找到问题的根源。

当我写入dataText数组时,我将每个条目重写为要输入的最后一个条目。在我的测试用例中,最后一个条目是字符串@“null”,创建一个空数组。

找到解决方案时会回来。

EDIT2:

@RuslanSoldatenko注意到我在数组中设置对象后没有创建文本字符串的新实例。请查看评论以获取帮助。

0 个答案:

没有答案