Невозможно установить iVars в XMLParser

Я создал класс XMLParser в target-c, и я не могу установить iVars в моем общем хранилище в процессе синтаксического анализа, я пробовал множество способов, но ничего не получилось.

Это мой код и то, что возвращается. Здесь мы надеемся, что это небольшая синтаксическая ошибка, которую я пропустил.

.час

@interface XMLParser : NSXMLParser <NSXMLParserDelegate>
{
    XMLParser *XMLStore;
}

@property(nonatomic, weak)NSMutableString *longitudeValue;
@property(nonatomic, weak)NSMutableString *latitudeValue;

+ (XMLParser *)sharedStore;
- (void)parseXMLAtURL:(NSURL *)url;

@end

.m

#import "XMLParser.h"

@implementation XMLParser

BOOL blockLatLong = NO;
NSMutableString *currentNodeContent;

+ (XMLParser *)sharedStore
{
    static XMLParser *XMLStore = nil;
    if (!XMLStore)
        XMLStore = [[XMLParser alloc] init];

    return XMLStore;
}

- (void)parseXMLAtURL:(NSURL *)url
{
    NSXMLParser *parser = [[XMLParser alloc] initWithContentsOfURL:url];

    parser.delegate = self;

    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];

    [parser parse];
    NSLog(@"Long:%@, Lat:%@", XMLStore.longitudeValue, XMLStore.latitudeValue);
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = [NSMutableString stringWithString:string];
}




-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"geometry"]){
        blockLatLong = YES;
    }

    if ([elementName isEqualToString:@"location_type"]){
        blockLatLong = NO;
    }
}




- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (blockLatLong){

    if ([elementName isEqualToString:@"lng"]){
        [XMLStore setLongitudeValue:currentNodeContent];
        NSLog(@"%@", currentNodeContent);
        NSLog(@"%@", XMLStore.longitudeValue);
    }

    if ([elementName isEqualToString:@"lat"]){
        [XMLStore setLatitudeValue:currentNodeContent];
        NSLog(@"%@", currentNodeContent);
        NSLog(@"%@", XMLStore.latitudeValue);
    }

    }
}


@end

Журнал

2013-09-23 11:19:59.606 Weathalert[640:c07] 40.7143528
2013-09-23 11:19:59.606 Weathalert[640:c07] (null)
2013-09-23 11:19:59.607 Weathalert[640:c07] -74.0059731
2013-09-23 11:19:59.607 Weathalert[640:c07] (null)
2013-09-23 11:19:59.607 Weathalert[640:c07] Long:(null), Lat:(null)

1 ответ

Решение

Ваша проблема в том, что у вас есть три экземпляра XMLParser где вы могли бы установить переменную экземпляра:

  1. Местный NSXMLParser *parser выделяется внутри parseXMLAtURL:,
  2. Функция статическую static XMLParser *XMLStore выделяется внутри sharedStore, а также
  3. Переменная экземпляра XMLParser *XMLStore; который вы никогда не выделяете, поэтому он остается nil,

Это третий случай, когда вы пытаетесь вызвать свои сеттеры. Так как это nil, звонки не имеют никакого эффекта: [XMLStore setLongitudeValue:...] ничего не делает.

Чтобы это исправить, удалите вторую и третью переменные вместе с +(XMLParser *)sharedStore метод. Используйте обычные свойства экземпляра вместо доступа к общему.

Вы можете получить результаты от местных parser переменная по завершении [parser parse] вызов:

NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);
Другие вопросы по тегам