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];
}
我正在使用自动引用计数。那么我的代码有什么问题?
答
我假设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
尝试启用NSZombie为您的应用程序..可能是它可以帮助 – 2012-08-17 10:39:41
如何启用 – 2012-08-17 10:53:36
产品 - >编辑方案 - >诊断 - >(选择)启用僵尸对象 – 2012-08-17 10:54:56