2012-08-17 51 views
0

我在我的應用程序中使用了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

回答

0

我假設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

相關問題