传递NULL值
我使用NSXMLParser的一个实例。我将存储在NSMutableDictionary中的NSMutableStrings中存储的字符存储在NSMutableDictionary中,然后将这些字符串添加到NSMutableArray中。传递NULL值
当我测试这一切似乎正常:我计数1个数组,x个字典和x个字符串。
在一个detailview控制器文件中,我想显示我的解析结果。我调用存储everthing的类,但是我得到(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文件我得到了我的结果。我做错了什么,所以我不能在我的控制器文件中调用我的结果? 欢迎任何帮助,因为我现在很坚持:/
您可能没有初始化NSMutableString元素,因此您可能将消息发送给一个无对象。
这是一个猜测,因为你没有发布重要的代码。我们需要看到
- 在您初始化三个对象
- 在那里你将它们分配例如你可能会在没有意识到的情况下将nil分配给其中的一个。
编辑下面的代码最新位
有不少错误的代码,例如,它泄漏大量的对象,但我看不到任何会导致您的具体问题,除非ELEMENTNAME元素不出现在XML中的CONTAINER元素中。
我不是iPhone上的用户界面代码的专家,但你确定applicationDidFinishLaunching在之前运行viewDidLoad?
此外,您似乎永远不会将您的解析器分配给aXMLParser属性。
其他一些问题
你的NSXMLParser泄漏,因为你不松开的。
你自己的解析器也出于同样的原因泄漏(你可能只想使用aXMLParser,而不是本地定义的)。
你initXMPLarser方法应该是这样的:
- (XMLParser *) initXMLParser {
self = [super init];
if (self != nil)
{
appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate];
}
return self;
}
即不要扔掉[超级初始化]的结果,并确保它不是零。
数组每次点击一个新元素时分配一次。每碰到一个新元素,就抛弃并从最后一个元素泄漏前一个数组。
字典在您每次点击CONTAINER元素时进行分配。在分配新分配之前,您至少应该释放旧分配。
元素也泄漏。
您放入数组的字典副本也会泄漏。 Objective-C集合保留其元素。
这是Objective-C。 – BobbyShaftoe 2010-06-14 18:09:48
感谢您注意到BobbyShaftoe。 – FFXIII 2010-06-15 08:30:17