我在我的应用程序中使用xml解析器。当我运行我的应用程序10到15次时,它的工作正常,但突然它给了我bad_access与上面的代码。我的xml解析器代码如下:
-(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 :(得分:0)
我假设getTheServerStatus是在一个不是主线程的线程上调用的。然而,你在主线程上进行解析。是否有可能第二个线程破坏解析器?
编辑:代码已更改
所以你应该做的不是在getTheServerStatus:中阻止,而是将你的问题分成两部分。首先是你想要获得状态 - 所以你将派遣一个区块为你做这项工作。在这种情况下,你可以抛出一个微调器,或者只是禁用你的一些UI。这当然是一个设计决定。当后台线程查找状态完成后,它会在主线程上通过结果向您发送消息,然后您可以执行任何您想要的操作。我只是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 .....
}