xmlParser中的exc_bad_access(code = 2,address = 0x20)

xmlParser中的exc_bad_access(code = 2,address = 0x20)

问题描述:

我在我的应用程序中使用了xml解析器。当我运行10到15次的应用程序时,它的工作正常,但突然它给了我上面代码的bad_access。我的XML解析器代码如下:xmlParser中的exc_bad_access(code = 2,address = 0x20)

-(BOOL)getTheServerStatus:(NSData *)webData 
{ 
    if (webData==NULL) 
    { 
     return FALSE; 
    } 

    parser=[[NSXMLParser alloc]initWithData:webData]; 
    [parser setDelegate:self]; 

    [self performSelectorOnMainThread:@selector(parseData:) 
          withObject:webData 
         waitUntilDone:YES]; 


    if([strVal isEqualToString:@"ok"]) 
    { 
     return TRUE; 
    } 

    else 
    { 
     return FALSE; 

    } 

} 

- (void)parseData:(NSData *)webData 
{ 
    if(webData==NULL) 
    { 
     NSLog(@"web data is NULL"); 
    } 
    [parser parse]; 
} 

我正在使用自动引用计数。那么我的代码有什么问题?

+0

尝试启用NSZombie为您的应用程序..可能是它可以帮助 – 2012-08-17 10:39:41

+0

如何启用 – 2012-08-17 10:53:36

+0

产品 - >编辑方案 - >诊断 - >(选择)启用僵尸对象 – 2012-08-17 10:54:56

我假设getTheServerStatus被调用的线程不是主线程。然而,你在主线程上做了解析。第二个线程是否有可能破坏解析器?

编辑:代码改变

那么你应该做getTheServerStatus不是块:,但打破你的问题分为两个部分。首先是你想获得状态 - 所以你要派一个块为你做这个工作。在发生这种情况时,您可以抛出一个微调,或者只是禁用一些用户界面。当然这是一个设计决定。当后台线程查找状态完成后,它会通过结果向主线程发回消息,然后您可以采取任何您想要的操作。我只是posted对类似问题的答案,它有更多的代码,您可能会发现有帮助。

{ // ivars 
    NSXMLParser *parser; // so you can send it abortParsing to cancel the background block 
} 

-(void)getTheServerStatus:(NSData *)webData 
{ 
    if (webData==nil) // nil is for objects, NULL for pointers 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ [self parseResult:NO]; }); 
    } 

    parser=[[NSXMLParser alloc]initWithData:webData]; 
    [parser setDelegate:self]; 

    dispatch_async(dispatch_get_global_queue(0,0),^
     { 
      BOOL ret = [parser parse]; 
      parser = nil; 
      if(ret == YES) { 
        ret = [strVal isEqualToString:@"ok"]; // EDIT 
      } 
      dispatch_async(dispatch_get_main_queue(), ^{ [self parseResult:ret]; }); 
     }); 
} 

-(void)parserResult:(BOOL)retCode 
{ 
    // now on main thread... 
    if(retCode == YES) .... 
    else ..... 
} 
+0

但我不想从解析器返回成功代码返回。我解析web响应正在作为其属性之一的状态。我想返回的状态,这就是为什么我检查如果([strVal isEqualToString:@“ok”]) – 2012-08-18 06:18:18