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 オブジェクトに送信している可能性があります。

重要なコードを投稿していないため、これは推測です。見る必要があります

  • 3 つのオブジェクトを初期化する場所
  • それらを割り当てる場所、たとえば、気付かないうちにそれらの1つに 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;    
}

つまり、[super init] の結果を破棄せず、nil でないことを確認してください。

配列は、新しい要素にヒットするたびに割り当てられます。新しい要素にヒットするたびに、最後の要素から前の配列を破棄してリークします。

CONTAINER 要素にヒットするたびに辞書が割り当てられます。新しいものを割り当てる前に、少なくとも古いものを解放する必要があります。

エレメントも漏れます。

配列に入れた辞書のコピーもリークします。Objective-C コレクションは、その要素を保持します。

于 2010-06-14T17:25:46.787 に答える