Objective c 传递空值

Objective c 传递空值,objective-c,null,uiviewcontroller,nsxmlparser,nsmutabledictionary,Objective C,Null,Uiviewcontroller,Nsxmlparser,Nsmutabledictionary,我使用了NSXMLParser的一个实例。我将在NSMutableString中找到的字符存储在NSMutableDictionary中,然后将这些dict添加到NSMutableArray中 当我测试这个时,一切似乎都很正常:我数了1个数组,x个单词和x个字符串 在detailview控制器文件中,我希望显示解析的结果。我调用存储所有内容但返回null的类 这是我做错的: xAppDelegate.h @interface xAppDelegate : NSObject <UIAppl

我使用了NSXMLParser的一个实例。我将在NSMutableString中找到的字符存储在NSMutableDictionary中,然后将这些dict添加到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];
}
当我测试数组、dict或XMLParser.h文件中的元素的值时,我得到了结果。我做错了什么,所以无法在控制器文件中调用结果?
欢迎提供任何帮助,因为我现在非常困惑:/

您可能还没有初始化NSMutableString元素,因此您可能正在向nil对象发送消息

这是一个猜测,因为您尚未发布重要代码。我们需要看看

初始化这三个对象 您分配它们的位置,例如,您可能在未意识到的情况下将nil分配给其中一个。 根据最新的一段代码进行编辑

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

我不是iPhone用户界面代码方面的专家,但您确定ApplicationIDFinishLaunching在viewDidLoad之前运行吗

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

其他一些问题

您的NSXMLParser会泄漏,因为您没有释放它

您自己的解析器也会泄漏,原因与您可能只想使用aXMLParser,而不是本地定义的解析器相同

您的initXMPLarser方法应该如下所示:

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

    return self;    
}
i、 e.不要丢弃[super init]的结果,并确保它不是零

数组在每次命中新元素时分配。每碰到一个新元素,就扔掉并泄漏上一个元素的前一个数组

每次命中容器元素时都会分配字典。您至少应该在分配新的之前释放旧的

元件也会泄漏


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

如果其中一个字符串被分配为nil,那么什么都不起作用?我有很多空白和新行等,但是foundIgnorableWhitespace函数不会自动处理这些吗?谢谢你answer@FFXIII:您可以编辑您的问题以包含新代码吗?这会使格式更清晰。我不确定foundIgnorableWhateSpace:不是所有元素中的空间都是可忽略的。那么,您实际在哪里使用XML解析器调用解析操作呢?我没有在这里显示所有代码。数组中,每个dict&元素都被释放了,但我不知道如何释放dict的副本。容器只是一个容器标签,我知道我在这里犯了一个错误。我以为didStartelement只能运行1x。我将变量的alloc/init移到了parserDidStartDocument。我还改变并理解了initXMPLarser方法。是的,ApplicationIDFinishLaunching在viewDidLoad之前运行,通过使用断点进行检查。显然,从这一切,我仍然不明白为什么我得到空…你发布一个字典的副本,就像一个字典一样。在代码中,可以这样做:[array addObject:[[dictionary copy]autorelease]]。我仍然不知道你在哪里设置了axmlparsertank,因为你注意到了BobbyShaftoe。
- (XMLParser *) initXMLParser { 
    self = [super init];
    if (self != nil)
    {
        appDelegate = (xAppDelegate *)[[UIApplication sharedApplication] delegate];
    }

    return self;    
}