【问题标题】:XCode 6.1 iOS 8.1 crashing- NSXMLParser does not support reentrant parsingXCode 6.1 iOS 8.1 崩溃- NSXMLParser 不支持重入解析
【发布时间】:2015-01-08 21:51:06
【问题描述】:

我遇到了 NSXMLParser 的问题。我的源在 iOS7/XCode 5 中运行良好,但在 iOS8.1/XCode 6 中崩溃。崩溃错误是:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSXMLParser does not support reentrant parsing.'

我在this post 中尝试了其他解决方案,但仍然发生错误。任何人都可以帮助我更多?

我的来源是这样的

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, NSXMLParserDelegate>
{
    NSXMLParser *xmlParser_;
...
}

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self parseData];
    ....
}

- (void)parseData
{
    titleList_ = [[NSMutableArray alloc] init];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fDetail ofType:fXML];
    if (filePath)
    {
        NSString *myText = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        if (myText)
        {
            countPage_ = 2;
            NSData *xmlData = [myText dataUsingEncoding:NSUTF16StringEncoding];//NSUTF8StringEncoding];
            xmlParser_ = [[NSXMLParser alloc] initWithData:xmlData];
            xmlParser_.delegate = self;
            [xmlParser_ parse];

        }
    }
}

【问题讨论】:

    标签: ios8 nsxmlparser


    【解决方案1】:

    相同的代码在 iOS 8/XCode 6 中对我来说很好用。 这是我的代码:

    NSString *elementname;
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
      [self parseData];
      return YES;
    }
    
    - (void)parseData
    {
      titleList_ = [[NSMutableArray alloc] init];
      NSString *fDetail = [NSString stringWithFormat:@"sample"];
      NSString *filePath = [[NSBundle mainBundle] pathForResource:fDetail ofType:@"xml"];
      if (filePath)
      {
        NSString *myText = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        if (myText)
        {
          countPage_ = 2;
          NSData *xmlData = [myText dataUsingEncoding:NSUTF16StringEncoding];//NSUTF8StringEncoding];
          xmlParser_ = [[NSXMLParser alloc] initWithData:xmlData];
          xmlParser_.delegate = self;
          [xmlParser_ parse];
    
        }
      }
    }
    
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
    {
      elementname = elementName;
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
      elementname = elementName;
    }
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
      if([elementname isEqualToString:@"CatalogId"])
      {
          int64_t cId = [string longLongValue];
          NSLog(@"%lld",cId);
      }
    
    }
    

    @结束

    【讨论】:

    • 谢谢普里亚。现在它对我有用。我误解了制作 double didStartElement(..), didEndElement:(..) 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多