Передача значения NULL - PullRequest
       24

Передача значения NULL

0 голосов
/ 14 июня 2010

Я использую экземпляр NSXMLParser.Я храню найденные символы в NSMutableStrings, которые хранятся в NSMutableDictionary, и затем эти Dicts добавляются в NSMutableArray.

Когда я проверяю это, все кажется нормальным: я считаю 1 массив, x словарей и x строк.

В файле контроллера detailview я хочу показать мои проанализированные результаты.Я вызываю класс, в котором хранится все, но я получаю (ноль) возвращенное.

Вот что я делаю (неправильно):

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);
}

Когда я проверяю значение моего массива, dict или элемента в файле XMLParser.h, я получаю свой результат.Что я делаю неправильно, поэтому я не могу назвать свои результаты в файле контроллера?Любая помощь приветствуется, потому что я сейчас застрял: /

1 Ответ

0 голосов
/ 14 июня 2010

Возможно, вы не инициализировали элемент NSMutableString, поэтому вы, вероятно, отправляете сообщения объекту nil.

Это предположение, потому что вы не опубликовали важный код. Нам нужно увидеть

  • где вы инициализируете три объекта
  • где вы их назначаете, например возможно, вы назначаете ноль одному из них, не осознавая этого.

Отредактировано после последнего бита кода

В коде много ошибок, например, он пропускает много объектов, но я не вижу ничего, что могло бы вызвать вашу конкретную проблему, если только элементы ELEMENTNAME не появляются внутри элементов CONTAINER ваш XML.

Я не эксперт по коду пользовательского интерфейса на iPhone, но вы уверены, что applicationDidFinishLaunching запускается до viewDidLoad?

Кроме того, вы, кажется, никогда не назначаете свой анализатор свойству aXMLParser.

Некоторые другие вопросы

Ваш NSXMLParser протекает, потому что вы его не выпускаете.

Ваш собственный синтаксический анализатор также имеет утечку по той же причине (вы, вероятно, просто хотите использовать aXMLParser, а не локально определенный).

Ваш метод initXMPLarser должен выглядеть следующим образом:

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

    return self;    
}

т.е. не выбрасывайте результат [super init] и убедитесь, что он не ноль.

массив выделяется каждый раз, когда вы нажимаете новый элемент. Каждый раз, когда вы нажимаете на новый элемент, вы выбрасываете и пропускаете предыдущий массив из последнего элемента.

словарь выделяется каждый раз, когда вы нажимаете элемент CONTAINER. Вы должны по крайней мере освободить старый, прежде чем выделять новый.

элемент также протекает.

Копия словаря, который вы поместили в массив, также утекает. Коллекции Objective-C сохраняют свои элементы.

...