1

我在objective-c 中创建了一个XMLParser 类,我似乎无法在解析器进程中的共享存储中设置iVar,我尝试了很多方法,但我无处可去。

这是我的代码和返回的内容,希望这是我忽略的一个小语法错误。

。H

@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)
4

1 回答 1

1

您的问题是您有三个XMLParser可以设置实例变量的实例:

  1. 本地NSXMLParser *parser分配在里面parseXMLAtURL:
  2. static XMLParser *XMLStore内部分配的静态函数sharedStore,和
  3. 您从不分配的实例变量XMLParser *XMLStore;,所以它保持nil.

这是您尝试调用 setter 的第三个实例。因为它是nil,所以调用没有效果:[XMLStore setLongitudeValue:...]什么都不做。

要解决此问题,请删除第二个和第三个变量以及+(XMLParser *)sharedStore方法。使用常规实例属性,而不是访问共享的。

您可以在调用parser完成后从局部变量中获取结果:[parser parse]

NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);
于 2013-09-23T10:50:17.867 回答