0

我使用 NSXMLParser 的一个实例。我将找到的字符存储在存储在 NSMutableDictionary 中的 NSMutableStrings 中,然后将这些 Dicts 添加到 NSMutableArray 中。

当我对此进行测试时,一切似乎都很正常:我数了 1 个数组、x 个字典和 x 个字符串。

在 detailview 控制器文件中,我想显示我的解析结果。我调用存储所有内容的类,但返回 (null)。

这就是我所做的(错误):

xAppDelegate.h

@interface xAppDelegate : NSObject <UIApplicationDelegate> {    
    UIWindow *window;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

xAppDelegate.m

#import "xAppDelegate.h"
#import "RootViewController.h"
#import "XMLParser.h"

@implementation xAppDelegate
@synthesize window, navigationController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // OFFLINE DOCUMENT > Resources folder
    NSString *Path = [[NSBundle mainBundle] bundlePath];
    NSString *DataPath = [Path stringByAppendingPathComponent:@"file.xml"];
    NSData *Data = [[NSData alloc] initWithContentsOfFile:DataPath];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:Data];       

    XMLParser *parser = [[XMLParser alloc] initXMLParser];

    [xmlParser setDelegate:parser]; 
    [xmlParser setShouldProcessNamespaces:NO];
    [xmlParser setShouldReportNamespacePrefixes:NO];
    [xmlParser setShouldResolveExternalEntities:NO];

    [xmlParser parse];      

    [window addSubview: navigationController.view];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [window release];
    [navigationController release];
    [super dealloc];
}
@end

    XMLParser.h
@class xAppDelegate;

    @interface XMLParser : NSObject {
        NSMutableArray *array;
        NSMUtableDictionary *dictionary;
        NSSMutabletring *element;
xAppDelegate *appDelegate;
    }
- (XMLParser *) initXMLParser;
    @property (nonatomic, retain) NSMutableArray *array;
    @property (nonatomic, retain) NSMutableDictionary *dictionary;
    @property (nonatomic, retain) NSMutableString *element;


    XMLParser.m
#import "xAppDelegate.h"
#import "XMLParser.h"

    @synthesize array, dictionary, element;
- (XMLParser *) initXMLParser { 
[super init];
appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate];

return self;    
}

- (void)parserDidStartDocument:(NSXMLParser *)parser {  
    array = [[NSMutableArray alloc] init];
        dictionary = [[NSMutableDictionary alloc] init];
}

    - (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict
{
    ele = [elementName copy];
    if ([elementName isEqualToString:@"CONTAINER"]) {
        element = [[NSMutableString alloc] init];
    }
}
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSMutableString *)string
{   
    if ([ele isEqualToString:@"ELEMENTNAME"]) {
        [element appendString:string];
    }
}
- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"CONTAINER"]) {
        [dictionary setObject:element forKey:@"ELEMENTNAME"];
        [array addObject:[dictionary copy]];
        }
}
- (void) dealloc {  
[element release];
[dictionary release];
[array release];
}

在我的控制器文件中,我这样做:

controller.h
@class XMLParser;

@interface controller : UIViewController {
 XMLParser *aXMLParser;
}

@property (nonatomic, retain) XMLParser *aXMLParser;

controller.m
#import "XMLParser.h"

@synthesize aXMLParser;

- (void)viewDidLoad {
    NSLog(@"test array: %@", aXMLParser.array);
    NSLog(@"test dict: %@", aXMLParser.dictionary);
    NSLog(@"test element: %@", aXMLParser.element);
}

当我在 XMLParser.h 文件中测试我的数组、字典或元素的值时,我得到了我的结果。我做错了什么,所以我不能在我的控制器文件中调用我的结果?欢迎任何帮助,因为我现在很困惑:/

4

1 回答 1

0

您可能尚未初始化 NSMutableString 元素,因此您可能正在向 nil 对象发送消息。

这是一个猜测,因为您还没有发布重要的代码。我们需要看看

  • 初始化三个对象的地方
  • 您在哪里分配它们,例如,您可能在没有意识到的情况下将 nil 分配给其中一个。

按照最新的代码进行编辑

代码有很多错误,例如,它泄漏了很多对象,但我看不到任何会导致您的特定问题的东西,除非 ELEMENTNAME 元素没有出现在您的 XML 中的 CONTAINER 元素中。

我不是 iPhone 用户界面代码方面的专家,但您确定 applicationDidFinishLaunching在vi​​ewDidLoad之前运行吗?

此外,您似乎从未将解析器分配给 aXMLParser 属性。

其他一些问题

您的 NSXMLParser 泄漏是因为您没有释放它。

您自己的解析器也出于同样的原因泄漏(您可能只想使用 XMLParser,而不是本地定义的解析器)。

您的 initXMPLarser 方法应如下所示:

- (XMLParser *) initXMLParser { 
    self = [super init];
    if (self != nil)
    {
        appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate];
    }

    return self;    
}

即不要丢弃[super init] 的结果并确保它不为零。

每次点击新元素时都会分配数组。每次碰到一个新元素时,您都会丢弃并从最后一个元素中泄漏前一个数组。

每次点击 CONTAINER 元素时都会分配字典。在分配新的之前,您至少应该释放旧的。

元素也泄漏。

您放入数组的字典副本也会泄漏。Objective-C 集合保留了它们的元素。

于 2010-06-14T17:25:46.787 回答