0

我使用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文件我得到了我的結果。我做錯了什麼,所以我不能在我的控制器文件中調用我的結果? 歡迎任何幫助,因爲我現在很堅持:/

+0

這是Objective-C。 – BobbyShaftoe 2010-06-14 18:09:48

+0

感謝您注意到BobbyShaftoe。 – FFXIII 2010-06-15 08:30:17

回答

0

您可能沒有初始化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集合保留其元素。

+0

如果其中一個字符串得到零分配,什麼都不會工作? 我有很多空格和新行等,但沒有foundIgnorableWhitespace功能自動照顧呢? Thx爲您的答案 – FFXIII 2010-06-14 17:50:57

+0

@FFXIII:你可以編輯你的問題,包括新的代碼?它會使格式更清晰。我不確定發現的是什麼價值空間空間:並非所有元素中的空間都是可以忽略的。 – JeremyP 2010-06-15 07:22:37

+0

那麼你在哪裏實際調用你的XML解析器的解析操作? – JeremyP 2010-06-15 12:51:24